单引号双引号等特殊字符插入mysql数据库失败

本文介绍了一种常见的爬虫技术问题:从网站获取的文章内容因包含特殊字符导致无法正常存入数据库的情况,并提供了解决方案——使用PHP的addslashes()函数对数据进行转义处理。

情景再现:

从网站爬取技术文章,文章内容、标签、样式包含各种单引号双引号,入数据库失败。

代码如下:


报错如下:

解决办法:

入库前对入库的值进行转义,可使用php系统函数addslashes()。

代码如下:

结果如下:



github地址:

https://github.com/themeth/test/blob/master/grub/Db.php

<think> 嗯,用户这次问的是数据库字符串该用单引号还是双引号的问题。从对话历史看,用户之前问过MySQL字符串定界符,现在转向更基础的引号使用规则,可能是实际开发中遇到了困惑。 用户提供的四个引用很有价值,但需要甄别:引用1-3讲Oracle,引用4对比了MySQL和Oracle。考虑到用户上次问MySQL,这次虽然没限定数据库,但应该以常用数据库为准。 核心矛盾点在于:不同数据库对引号的处理差异很大。需要分情况说明: 1. SQL标准规定字符串用单引号,所以MySQL/Oracle/PostgreSQL等主流数据库优先用单引号 2. 双引号在Oracle中用于保留字段名大小写(比如"UserName"),在MySQL的ANSI模式下也有类似作用 3. 用户引用2提到的VB连接字符串例子(&符号拼接)属于编程语言层面的处理,容易混淆 特别要注意用户引用4提到的陷阱:Oracle的to_char()日期格式必须用单引号,而别名含空格时必须用双引号。这个细节很多开发者会踩坑。 用户可能正在调试SQL语句,看到别人代码混用引号感到困惑。需要强调:单引号是字符串本体,双引号是标识符包装,二者完全不等价。用错会导致"ORA-01756"或"Unknown column"错误。 最后决定用对比表格呈现差异,因为用户引用4已经给出部分对比,可以在此基础上补充MySQL和SQL Server的情况。对于转义问题要单独说明,毕竟用户引用1提到Oracle用两个单引号转义,而MySQL是用反斜杠。 </think>在数据库中,字符串常量**必须使用单引号(' ')** 作为定界符,这是 SQL 标准的规定。双引号(" ")主要用于标识符(如表名、列名、别名等),而非字符串值。以下是具体说明: --- ### 一、单引号(' ')的核心作用 1. **定义字符串常量** 所有数据库MySQL、Oracle、SQL Server、PostgreSQL等)统一使用单引号包裹字符串: ```sql SELECT * FROM users WHERE name = 'Alice'; -- ✅ 正确 SELECT * FROM users WHERE name = "Alice"; -- ❌ 错误(MySQL宽松模式下可能允许,但不符合标准) ``` 2. **转义单引号本身** 若字符串内包含单引号,需通过 **两个连续单引号** 转义: ```sql -- 插入名字 O'Neil INSERT INTO users (name) VALUES ('O''Neil'); -- ✅ 正确 ``` --- ### 二、双引号(" ")的特有用途 1. **包裹包含特殊字符的标识符** 当表名、列名或别名包含空格、保留字或大小写敏感时,需用双引号包裹: ```sql -- Oracle/PostgreSQL:查询含空格的别名 SELECT first_name AS "Full Name" FROM employees; -- 创建包含保留字的表名 CREATE TABLE "order" ("id" NUMBER); -- "order"是SQL保留字 ``` 2. **强制保留标识符的大小写** 默认标识符不区分大小写,双引号可保留原始大小写: ```sql -- Oracle:别名显示为 "UserName"(而非默认大写) SELECT username AS "UserName" FROM users; ``` --- ### 三、不同数据库的差异 | **场景** | MySQL | Oracle | SQL Server | |------------------------|----------------------------|-----------------------------|---------------------------| | **字符串常量** | `'text'` | `'text'` | `'text'` | | **标识符包裹** | **反引号** `` `id` `` | **双引号** `"id"` | **方括号** `[id]` | | **别名含空格** | `` `Full Name` `` | `"Full Name"` | `[Full Name]` | | **转义字符串单引号** | `'O''Neil'` 或 `\'` | `'O''Neil'` | `'O''Neil'` | > 📌 **关键结论**: > - **字符串值永远用单引号 `' '`** > - **标识符按数据库规则选择 `" "`、`` ` ` `` 或 `[ ]`** > - 避免混用引号类型,否则可能引发语法错误[^1][^3][^4]。 --- ### 四、常见错误示例 ```sql -- 错误:尝试用双引号定义字符串(Oracle严格报错) SELECT * FROM products WHERE name = "Laptop"; -- 错误:未转义字符串中的单引号 INSERT INTO logs (message) VALUES ('It's an error'); -- 正确写法 INSERT INTO logs (message) VALUES ('It''s correct'); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值