sql标准规定单引号必须用两个连续单引号''转义,因反斜杠\'仅mysql旧版兼容且依赖no_backslash_escapes等配置,而''跨数据库通用、无需配置、无歧义。

SELECT 语句里含单引号的字符串,必须用两个连续单引号 '' 替代原字符,这是 SQL 标准写法,MySQL、PostgreSQL、SQL Server、Oracle 全都认。
为什么不能用反斜杠 \' 转义单引号?
MySQL 默认开启 sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION 时,\' 不被当作合法转义;即使关闭 strict 模式,\' 也只在旧版兼容模式下有效,且依赖 NO_BACKSLASH_ESCAPES 设置是否启用。而两个单引号 '' 是 SQL 标准,不依赖任何配置,所有主流数据库都原生支持。
- 错误写法:
WHERE name = 'O\'Reilly'→ 可能报错或被截断为O - 正确写法:
WHERE name = 'O''Reilly'→ 安全、通用、无歧义 - 注意:不是三个单引号
''',而是字符串内出现单引号的位置,用''替代一个单引号字符
拼接动态 SQL 时怎么避免漏转义?
用 CONCAT() 或字符串拼接生成 SQL(比如导出变更脚本)时,字段值本身含单引号,必须提前替换。直接拼会导致语法错误甚至注入风险。
- MySQL 示例:
SELECT CONCAT("UPDATE users SET note = '", REPLACE(note, "'", "''"), "' WHERE id = ", id, ";") FROM logs; - PostgreSQL / SQL Server 同理,先
REPLACE(col, '''', '''''')(即把一个'替成两个'') - 别信“加个
ESCAPE就行”——那是给LIKE用的,对普通字符串赋值无效
LIKE 查询里单引号和通配符要分开处理
LIKE 中的单引号仍需双写,但百分号 % 和下划线 _ 是通配符,若想查字面量,得用 ESCAPE 或方括号(SQL Server)。
- 查含单引号的值:
WHERE title LIKE '%O''Reilly%'✔️ - 查字面量
%:WHERE content LIKE '%100\%%' ESCAPE '\'(MySQL)或LIKE '%100[%]%'(SQL Server) - 混用场景容易漏:比如查
O'Reilly's,实际要写成'O''Reilly''s'—— 每个单引号独立双写,不是首尾包一层
SELECT 预览生成的字符串,而不是直接 EXECUTE。尤其在存储过程或脚本中拼接时,少一个 ' 就整条语句崩掉。











