SQL标准中LIKE仅将%和_视为通配符,查字面量时必须用ESCAPE显式转义;ESCAPE须紧跟LIKE后、指定单字符,且该字符不能在数据中高频出现,否则会导致误匹配或语法错误。

LIKE中哪些字符必须转义
SQL标准里,LIKE只把 % 和 _ 当作通配符,其余字符(比如 、[、])在多数数据库里不特殊,但如果你用的是 SQL Server 或 PostgreSQL 的 ESCAPE 子句,或者想匹配字面量的 % 或 _,就必须显式转义。
常见错误是直接写 WHERE name LIKE '10%' 想查“10%”这个字符串,结果却匹配了所有以“10”开头的值——因为 % 被当成了通配符。
ESCAPE子句怎么写才生效
ESCAPE 必须紧跟在 LIKE 表达式之后,且只能指定单个字符作为转义符;这个字符本身不能出现在待匹配字符串中(否则会出错或行为不可控)。
- 正确写法:
WHERE col LIKE '10%' ESCAPE '' - 错误写法:
WHERE col LIKE '10%' ESCAPE '\'(PostgreSQL 会报错:escape character must be a single character) - 错误写法:
WHERE col LIKE '10%' ESCAPE '/'(这时不再是转义符,%就是字面量反斜杠加百分号,不是转义)
MySQL 默认允许 作为隐式转义符,但显式写 ESCAPE 更可靠,尤其跨数据库迁移时。
不同数据库对ESCAPE的支持差异
不是所有数据库都支持 ESCAPE,而且默认行为可能冲突:
- MySQL:支持
ESCAPE,但若未指定,默认是转义符;启用NO_BACKSLASH_ESCAPESSQL mode 后,失效,必须用ESCAPE - PostgreSQL:严格要求
ESCAPE显式声明,不认默认转义符;ESCAPE ''是语法错误 - SQL Server:支持
ESCAPE,但更常用方括号语法如WHERE col LIKE '10[%]'来匹配字面量% - SQLite:支持
ESCAPE,但转义符不能是%、_或自身(即不能用%做 escape char)
如果写 WHERE col LIKE 'a_b' ESCAPE '',在 PostgreSQL 中能匹配 “a_b”,但在某些 MySQL 配置下可能报错或忽略转义——得看 sql_mode。
实际查询中容易踩的坑
最常被忽略的是:转义符本身也要在字符串里“存在”,所以拼接动态 SQL 时,要小心双重转义。
- 用 Python 拼接:
f"WHERE name LIKE '{keyword.replace('%', '\%').replace('_', '\_')}' ESCAPE '\'"—— 这里\是 Python 字符串里的一个反斜杠 - 如果数据库用
/当转义符,而 keyword 里恰好有/,就得先把它也转义:keyword.replace('/', '//').replace('%', '/%') - 参数化查询(如 JDBC PreparedStatement)不自动处理
LIKE转义,?占位符填进去的仍是原始字符串,ESCAPE得写死在 SQL 里
真正麻烦的不是语法,而是团队里有人写 ESCAPE '',有人写 ESCAPE '/';线上查不到数据时,第一反应往往是检查数据是否存在,而不是翻 SQL 里那个小小的 ESCAPE 字符是否和替换逻辑对得上。

















