必须显式声明escape子句,因反斜杠在mysql中不被默认识别为转义符;正确写法是like '%$%' escape '$',选生僻字符作转义符可避免数据冲突和上层字符串解析干扰。

为什么 LIKE '%\%' ESCAPE '\' 有时查不到含百分号的字段?
因为默认情况下,% 是 LIKE 的通配符,不是字面量;直接写 WHERE col LIKE '%\%' 不会生效——反斜杠 \ 在多数数据库里不被默认识别为转义字符,必须显式声明 ESCAPE 子句,且该子句要放在 LIKE 表达式之后。
不同数据库对 ESCAPE 字符的选择有差异
虽然标准 SQL 允许任意单字符作转义符,但实际使用中要注意兼容性:
- MySQL 默认支持
\,但需开启NO_BACKSLASH_ESCAPES模式时才必须用ESCAPE;更稳妥的是统一用ESCAPE '$'避免歧义 - PostgreSQL 不接受
\作默认转义符,必须指定,例如ESCAPE '#' - SQL Server 接受
ESCAPE,但若用\,需确保字符串字面量中未被语言层(如 C# 或 Python)提前吃掉 - Oracle 对转义符敏感,且要求转义符本身不能出现在被匹配的模式中(比如不能用
%自己做转义符)
推荐统一选一个生僻字符,比如 $ 或 !,降低出错概率。
正确写法:把百分号当普通字符查的三步
假设想查 name 字段中包含字面意义 % 的记录(例如值为 "discount: 50%"):
- 在
LIKE模式中,把目标%写成$%(假设选$为转义符) - 用
ESCAPE '$'显式声明 - 确保前后加通配符,如
LIKE '%$%'表示“中间任意位置含一个字面 %”
完整语句示例:SELECT * FROM products WHERE name LIKE '%$%' ESCAPE '$';
容易忽略的坑:转义符本身也得逃
如果误用 ESCAPE 字符作为数据内容(比如字段值含 $),而你又恰好选了 $ 当转义符,那查询可能意外失败或漏匹配。例如:
执行 WHERE name LIKE '%$' ESCAPE '$',数据库会把末尾的 $ 解释为转义开始,导致语法错误或行为异常。
真正要查以 $ 结尾的值,得写成 LIKE '%$$' ESCAPE '$'——第二个 $ 才是字面量。
所以选转义符前,最好先扫一眼目标字段里哪些字符出现频率低;别图省事硬套 \,尤其在多语言或 ORM 场景下,它最容易被上层字符串处理吞掉一层。











