LIKE 中的 %
和 _
是通配符,不是普通字符
MySQL 的
LIKE进行模糊匹配时,
%匹配任意长度(含零)的字符串,
_只匹配单个任意字符。它们只有在
LIKE或
NOT LIKE表达式中才生效;如果写进普通字符串或用
=比较,就只是字面意思的百分号或下划线。
转义特殊字符必须显式声明 ESCAPE
想查真实包含
%或
_的数据(比如用户名是
user_123或备注含
100%),不能直接写
WHERE col LIKE 'user_%'——这会把下划线当通配符,匹配
userA123、
user 123等所有第二位是任意字符的值。 必须指定一个转义字符,例如
\,并用
ESCAPE '\'然后写成
WHERE col LIKE 'user\_%' ESCAPE '\'或者用其他字符如
|:
WHERE col LIKE '100|%' ESCAPE '|'注意:MySQL 默认不识别反斜杠自动转义,
SET SQL_MODE = ''下
\%不起作用,必须配
ESCAPE
_
容易被忽略长度约束,导致意外漏匹配或宽泛匹配
_强制要求“此处必须有一个字符”,所以
LIKE 'a_b'能匹配
aab、
acb,但不匹配
ab(太短)或
acdb(太长)。常见误用: 本想查以
abc开头的字段,错写成
LIKE 'abc_'→ 实际只匹配恰好 4 位且前三位是
abc的值 想查第 2 位是
x的 3 位编码,写
LIKE '_x_'是对的;但若长度不确定,就得换用
%x%字段含前导/尾随空格时,
_也会匹配空格,
'a_b '(末尾有空格)可能被
LIKE 'a_b'错误命中
性能上,前导 %
会让索引失效
只要
LIKE模式以
%开头(如
'%abc'或
'%ab%'),MySQL 无法使用 B+ 树索引做范围扫描,只能全表扫描。优化建议: 尽量用后缀匹配:
col LIKE 'abc%'→ 可走索引(前提是
col有索引) 需要前缀搜索又想加速,考虑生成冗余字段(如倒序存储)或用全文索引
FULLTEXT确认执行计划:
EXPLAIN SELECT * FROM t WHERE name LIKE '%foo%';看
type是否为
ALL
实际用的时候,先想清楚你要的是“长度可控的单字占位”还是“任意长度伸缩”,再选
_还是
%;只要模式里出现这两个符号,就必须同步检查是否要转义、是否影响索引、字段内容里是否真有这些字符。
