下划线\_是sql标准单字符通配符,需用escape显式转义才能匹配字面量;必须同时在like子句末尾声明escape '!'并在模式中写'!\_',且单引号包裹,跨库推荐用!或~作转义符。

LIKE里的下划线_为什么总匹配错?
因为_是SQL标准定义的单字符通配符,不是普通字符。写WHERE name LIKE 'a_b',实际会匹配aab、acb,而不是字面量a_b。这不是数据库bug,是规范行为——哪怕你查的是用户名user_name,不转义就必然漏数据或误命中。
必须同时做两件事:声明ESCAPE + 在模式里加转义符
只写ESCAPE '!'没用,只在字符串里写!_也没用,二者缺一不可:
- 在
LIKE子句末尾显式声明转义字符:ESCAPE '!' - 在模式串中,把该字符紧挨着放在
_前面:'user!_name',且整个模式必须用单引号包裹 - 转义符本身若要出现在模式里,得写两次:
'path!_file!_v2'ESCAPE '!' → 匹配字面量path_file_v2 - 别用
\当转义符:MySQL客户端常吃掉一层反斜杠,PostgreSQL默认不认,跨库极易失效
不同数据库的兼容写法差异
不是所有数据库都支持同一套语法:
- PostgreSQL / Oracle / SQLite:严格遵循标准,
ESCAPE必须显式写出,推荐用!或~ - MySQL:默认允许
\作转义符,但依赖SQL mode;显式写ESCAPE '!'更可靠 - SQL Server:不支持标准
ESCAPE语法,得用方括号:LIKE 'user[_]name',或改用ESCAPE(部分版本支持) - 参数化查询时,
ESCAPE必须写在SQL模板里,不能靠应用层拼接——传入'user_name'参数,不声明ESCAPE照样当通配符解释
最容易被忽略的三个执行细节
写完语句却查不到结果?大概率卡在这三处:
-
LIKE后面的模式串漏了单引号,比如写成LIKE user_name ESCAPE '!'→ 数据库当成字段名解析,报错或逻辑全乱 -
ESCAPE后多写了空格或用了中文符号:ESCAPE ' !'或ESCAPE '!'(中文叹号),直接语法错误 - 字段值里的下划线其实是Unicode变体(如全角
_或带零宽空格),表面看着一样,HEX()一查才发现是EFBFBD而非5F
真正难的不是写对语法,而是确认你要匹配的那个_,确实是ASCII 95。










