sql中匹配单个字符的通配符是_(下划线),它严格匹配且仅匹配一个任意字符,不接受零个或多个;误用会导致长度不匹配而漏查,需注意字段真实长度、编码及尾随空格影响。

SQL LIKE 中匹配单个字符的通配符是 _
不是 %,也不是 ? 或 * —— 在标准 SQL(包括 MySQL、PostgreSQL、SQL Server、Oracle)中,_(下划线)是唯一合法且跨数据库兼容的「匹配任意单个字符」通配符。
为什么写 LIKE 'abc_' 可能查不到你想要的数据
因为 _ 严格匹配「一个且仅一个」字符,不接受零个,也不接受多个。它不像 % 那样宽松,所以极易误判结果长度。
-
WHERE name LIKE 'abc_'只会命中长度为 4、前三位是abc的值,比如abcd、abC9,但不会匹配abc(太短)或abcdef(太长) - 如果字段含尾随空格(如
'abc '),而数据库 collation 忽略末尾空格,可能意外匹配;反之若严格校验,则'abc '和'abc'被视为不同,LIKE 'abc_'仍不匹配前者(因空格占一位,但第 4 位是空格而非“任意非空字符”) - 中文字符、emoji、UTF-8 多字节字符在部分旧版 MySQL(如 utf8mb3)中可能被截断或误判长度,导致
_匹配失败——建议确认字段使用utf8mb4且 collation 支持完整 Unicode
什么时候必须用 ESCAPE 处理 _
当你要查的**原始数据里就含有下划线字符**,而不是把它当通配符用时,必须转义。否则数据库会把那个 _ 当作通配符解析,造成漏查或错查。
- 例如:查折扣率字段值为
50_(表示“50 下划线”,非“50+任意单字符”),直接写WHERE rate LIKE '50_'会匹配50a、50z等所有 4 位以50开头的值 - 正确写法:
WHERE rate LIKE '50!_' ESCAPE '!',其中!是自定义转义符,!_表示字面意义的下划线 - 注意:
ESCAPE后只能跟**单个 ASCII 字符**,且该字符本身在 pattern 中出现时,必须加在待转义符号前;不能用\(除非数据库明确支持,如 PostgreSQL 允许ESCAPE '\',但 MySQL 不推荐)
_ 和正则表达式中的 . 不是一回事
别想当然地套用正则经验。_ 在 LIKE 中不支持字符类、重复次数、分组等任何扩展语义,它就是纯粹的「一位占位符」。
-
LIKE 'A_C'→ 匹配ABC、A2C、A C(空格也算一个字符),但不匹配AC或ABBC -
REGEXP 'A.C'(MySQL)或~ 'A.C'(PostgreSQL)→ 功能更强大,但性能更差、语法更复杂、跨库不兼容 - 如果你真需要类似
.+或[a-z]的能力,优先评估是否该换用正则函数(如REGEXP_LIKE),而不是硬凑多个_
_ 匹配的影响——尤其是从 Excel 或日志导入的数据常带不可见空格或 BOM,表面看是 3 位,实际存储为 4 字节,LIKE 'abc_' 就永远查不到。











