必须用ESCAPE子句显式转义,如WHERE name LIKE '%50!%' ESCAPE '!',因%和_在LIKE中默认为通配符,直接使用会导致非字面匹配。

LIKE查询里百分号%和下划线_怎么当普通字符用?
直接写 WHERE name LIKE '%50%' 会匹配所有含“50”的字符串,而不是字面意义的“50%”。因为 % 和 _ 是 LIKE 的通配符,必须显式转义才能按字面匹配。
- 标准做法是用
ESCAPE子句指定一个转义字符,比如或! - 转义字符本身不能出现在被搜索文本中,否则会出错;推荐用
!,它在业务数据里出现概率低 - 写法是:先在字符串里把
%替成!%,再加ESCAPE '!' - 示例:
WHERE description LIKE '%disk !% drive%' ESCAPE '!'—— 这才真正匹配含“disk % drive”的记录
MySQL里用反斜杠转义为什么有时失效?
MySQL默认把 当作字符串转义符(比如 'a
b'),所以 LIKE 中的 % 可能被提前解析掉,导致实际传给 LIKE 引擎的是单个 %。
- 要么关掉
NO_BACKSLASH_ESCAPESSQL mode(不推荐) - 要么改用双反斜杠:
LIKE '%100\%' ESCAPE '\' - 更稳妥的做法是换转义符,比如用
~:LIKE '%100~%' ESCAPE '~',完全避开反斜杠歧义 - 注意:如果字段值本身含
~,且你又用它做转义符,那这条记录就永远无法被这个LIKE匹配到
PostgreSQL里要额外处理反斜杠吗?
PostgreSQL 默认把反斜杠当普通字符,不像 MySQL 那样自动解释,但前提是字符串不是 E'' 形式(即非转义字符串字面量)。
- 安全写法是统一用
E''+ 双反斜杠:WHERE tag LIKE E'%cost\%%' ESCAPE '\' - 或者避开反斜杠,用其他字符:
WHERE tag LIKE '%cost|%%' ESCAPE '|' - PostgreSQL 还支持正则表达式
~操作符,如果只是查固定字符串,position('50%' in tag) > 0更快、更直白,还不用操心转义
参数化查询时LIKE的通配符和转义怎么处理?
参数化查询(如 PreparedStatement)只防止SQL注入,不自动处理 LIKE 转义 —— 你传进去的值还是得自己加转义符。
- 错误示范:
WHERE name LIKE ?,然后传入"50%"→ 依然匹配所有含“50”的记录 - 正确做法:应用层先把用户输入里的
%、_替换成!%、!_,再拼进LIKE ? ESCAPE '!' - 别在SQL里拼接转义符(比如
LIKE '%' || ? || '%'),容易漏掉对输入中已有的!做二次转义 - 如果用 ORM(如 Hibernate),确认它是否支持
escapeCharacter参数;JPA 2.0+ 的@Query支持ESCAPE,但原生查询仍需手动处理

















