sql中单引号必须用两个连续单引号''转义,如where content like '%o''reilly%';反斜杠\'不通用且不可靠,参数化查询是防错防注入的首选方案。

SQL里单引号怎么转义才能查出来
直接写 WHERE content LIKE '%'%' 会报错,因为单引号是字符串边界符,SQL解析器看到第一个 ' 就开始读字符串,遇到第二个 ' 就认为结束了,第三个 ' 就变成语法错误。正确做法是用两个连续单引号 '' 表示一个字面量单引号。
- MySQL、PostgreSQL、SQL Server 都支持
''转义(注意不是\') - SQLite 默认也支持,但需确认未开启
PRAGMA legacy_alter_table = ON等影响行为的设置 - 如果字段值是
O'Reilly,查询条件应写成LIKE '%O''Reilly%'
LIKE 和 CHARINDEX / POSITION 怎么选
LIKE 最常用,但要注意通配符性能;如果只关心“是否存在”,用字符串定位函数更准、更快,且避免模糊匹配干扰。
- SQL Server:用
CHARINDEX('''', content) > 0—— 注意里面是两个单引号'',不是双引号 - PostgreSQL:用
POSITION('''' IN content) > 0或content ~ ''''(正则) - MySQL:用
INSTR(content, '''') > 0或LOCATE('''', content) > 0 - 避免写
LIKE '%''%'查所有含单引号的行——它会命中don't、I'm,但也可能误伤带两个单引号的正常数据(比如转义后的O''Reilly)
WHERE 条件里拼接单引号容易漏掉什么
动态拼SQL时,很多人手写字符串拼接,结果忘了对用户输入里的单引号二次转义,导致注入或语法错误。
- 应用层传参时,如果用字符串模板拼
"... WHERE name = '" + userInput + "'",而userInput是O'Reilly,最终语句变成WHERE name = 'O'Reilly'—— 直接报错 - 正确做法:参数化查询(如 JDBC 的
PreparedStatement、Python 的cursor.execute("...", [value])),数据库驱动会自动处理转义 - 实在要拼接,先对变量做转义:JavaScript 用
str.replace(/'/g, "''"),Python 用value.replace("'", "''")(仅限 SQL Server/PostgreSQL;MySQL 用\'不通用,别这么干)
查出来之后怎么安全导出或显示
查到含单引号的数据只是第一步;导出 CSV、渲染到 HTML 或写入日志时,不额外处理,照样会崩。
- 导出 CSV:字段值必须用双引号包裹,且内部双引号要转成两个双引号 —— 单引号本身不用转,但整个字段建议加引号防分割错位
- 前端展示:HTML 中直接插
innerHTML会把O'Reilly解析成 JS 字符串截断,得用textContent或服务端 HTML-encode(') - 日志打印:用结构化日志(如 JSON 格式),确保序列化器正确处理引号,别用
console.log('name:', row.name)这种裸打
CHARINDEX 准确捞出了所有带单引号的记录,结果导出时 CSV 用逗号分隔、没包双引号,整行就错位了。











