下划线“_”是SQL标准规定的单字符通配符,严格匹配且仅匹配一个任意字符;需用ESCAPE显式转义(如LIKE 'a!_b' ESCAPE '!')才能匹配字面下划线,否则会误匹配。

为什么LIKE里的下划线会匹配任意单字符
因为 _ 是 LIKE 的原生通配符,和 % 一样有特殊含义。哪怕你只是想查字段值里真实存在的下划线(比如用户名 user_name),不加转义就会被当成“任意一个字符”去匹配,导致结果错乱或漏数据。
用ESCAPE指定转义字符并写在LIKE字符串里
必须同时做两件事:一是在 LIKE 子句末尾用 ESCAPE 关键字声明一个转义字符;二是在待匹配的模式串中,把这个字符紧挨着放在 _ 前面。常见选 、! 或 #,但要注意该字符本身不能在原始数据里高频出现,否则容易误转义。
SELECT * FROM users WHERE username LIKE 'user_name' ESCAPE '';SELECT * FROM logs WHERE event LIKE 'ERROR!_timeout' ESCAPE '!';- 如果选
#作转义符,就得写成'user#_name' ESCAPE '#',不能漏掉单引号
不同数据库对ESCAPE字符的限制差异
PostgreSQL 要求 ESCAPE 后只能跟单个字符,且不能是空格或通配符本身;MySQL 允许使用反斜杠作为默认转义符(即不写 ESCAPE 时 _ 也生效),但显式声明更可靠;SQL Server 不支持标准 ESCAPE 语法,得改用方括号绕过:LIKE 'user[_]name'。
- Oracle 和 PostgreSQL 完全遵循 SQL 标准,
ESCAPE必须显式写出 - SQLite 支持
ESCAPE,但若未指定,反斜杠不自动生效,这点常被忽略 - 转义字符本身如果要出现在模式里,需写两次,例如用
转义自身:'path\_file' ESCAPE ''
容易漏掉的三个执行细节
写完语句后仍查不到预期结果?大概率卡在这三处:
- 忘记给整个模式串加单引号,比如写成
LIKE user_name ESCAPE ''—— 这会报错或当字段名解析 - 转义字符在
ESCAPE后多写了空格或用了中文符号,如ESCAPE ' '或ESCAPE '\' - 字段值里下划线前后有不可见字符(比如 tab 或全角空格),导致表面匹配失败,建议先用
LENGTH()和HEX()检查实际字节
真正难的不是语法,而是确认你要匹配的那个下划线,确实是 ASCII 95,而不是看起来像的其他 Unicode 字符。











