sql中单引号字符串必须用两个连续单引号''转义,如'o''reilly',不可用反斜杠;所有主流数据库均支持该标准写法,动态拼接时应优先使用参数化查询防错防注入。

SQL里单引号字符串怎么写才不报错
直接在字符串里写 ' 会中断字面量,导致语法错误或注入风险。标准做法不是用反斜杠转义(多数数据库不认 \'),而是把单引号写成两个连续单引号 '' —— 这是 SQL 标准定义的转义方式,所有主流数据库(PostgreSQL、SQL Server、SQLite、Oracle)都支持,MySQL 在 ANSI 模式下也支持。
WHERE条件中匹配带单引号的姓名或地址
比如查姓氏为 O'Reilly 的用户,不能写 WHERE name = 'O'Reilly'(语法错误),必须双写内部单引号:
SELECT * FROM users WHERE name = 'O''Reilly';
常见错误现象:ERROR: syntax error at or near "Reilly" 或类似提示,本质是解析器在第一个 ' 就结束了字符串字面量。
- 别尝试用
\',MySQL 默认模式下它会被当作普通字符处理,但语义不可靠;PostgreSQL 直接报错 - 如果字段值本身含多个单引号(如
John's "quote" isn't right),全部单引号都要成对出现:'John''s "quote" isn''t right' - 双引号在 SQL 字符串中无需转义,仅单引号需要
动态拼接SQL时怎么安全插入带单引号的值
手拼字符串极易出错,尤其当值来自用户输入。最稳妥的是用参数化查询(? 或命名参数),完全绕过引号处理问题。但如果必须拼接(比如构建 DDL 或日志语句),得手动替换:
- Python 示例:
value.replace("'", "''"),再套进f"WHERE x = '{escaped}'" - JavaScript(Node.js + pg):仍推荐
client.query('SELECT * FROM t WHERE n = $1', [userInput]),而非拼接 - 注意:某些 ORM(如 Django ORM)自动处理,但 raw SQL 查询仍需手动双写
MySQL 的特殊行为和兼容性陷阱
MySQL 默认使用 STRICT_TRANS_TABLES 和传统模式时,允许用反斜杠转义('O\'Reilly'),但这属于 MySQL 扩展,非标准,且在启用 ANSI_QUOTES 或严格模式后可能失效。
- 跨数据库迁移时,
''写法一定兼容,\'很可能挂掉 - 查看当前模式:
SELECT @@sql_mode;,含ANSI就别碰反斜杠 - 用
SELECT QUOTE('O''Reilly');可让 MySQL 返回已转义的字符串字面量(返回'O''Reilly'),适合调试
真正麻烦的不是怎么写,而是忘记在嵌套场景里逐层转义——比如 JSON 字段里存了带单引号的字符串,再用它去构造外层 WHERE,容易漏掉某一层。











