%匹配任意长度字符,_匹配单个字符;前缀匹配'abc%'可走索引,'%abc'或'%abc%'会全表扫描;查特殊字符需ESCAPE转义;全文检索应优先用FULLTEXT而非LIKE。

LIKE 语法中通配符的含义和用法
LIKE 的核心是两个通配符:% 匹配任意长度(含零)字符,_ 匹配单个任意字符。比如 '%abc' 匹配以 abc 结尾的字符串,'a_c' 匹配第二位是任意字符、以 ac 开头结尾的三字符串。
注意:大小写是否敏感取决于字段的排序规则(collation),例如 utf8mb4_general_ci 不区分大小写,而 utf8mb4_bin 区分。
常见错误现象:SELECT * FROM users WHERE name LIKE 'admin' —— 这不是模糊查询,等价于 = 'admin';漏掉通配符就失去模糊意义。
避免全表扫描:LIKE 左侧不能有通配符
当模式以 % 开头(如 '%test'),MySQL 无法使用索引,会触发全表扫描。只有形如 'test%' 的前缀匹配才可能走索引(前提是该列建了 B-tree 索引)。
实操建议:
- 对高频模糊搜索字段,优先考虑前缀匹配(
'abc%'),并确保该列有索引 - 若必须查后缀或中间匹配(
'%abc%'),可考虑生成冗余字段(如倒序存储REVERSE(name)),再建索引查'%cba' - 中文场景下,
LIKE对多字节字符支持正常,但不要依赖它做全文语义匹配——应换用FULLTEXT索引 +MATCH ... AGAINST
转义特殊字符:处理真实数据里的 % 和 _
如果要查包含字面意义的 % 或 _(比如用户昵称是 '100%'),不加转义会导致误匹配。MySQL 用 ESCAPE 指定转义符,例如:
SELECT * FROM products WHERE title LIKE '%100%%' ESCAPE '';
这表示把反斜杠 当作转义符,% 就代表字面上的 % 字符。
注意事项:
- 转义符本身不能是
%或_,否则语法报错 - 若字段值里真有反斜杠(如路径
'C: emp'),需写成'C:\temp'并在ESCAPE中声明'\' - 部分 ORM(如 Laravel Eloquent)会自动转义,但原生 SQL 必须手动处理
性能对比:LIKE vs REGEXP vs FULLTEXT
LIKE 最轻量,适合简单模式;REGEXP 功能强但更慢(尤其无索引时),且不走索引;FULLTEXT 是专为文本检索设计的,支持自然语言模式、布尔模式,但只支持 MyISAM 和 InnoDB 表,且要求字段类型为 CHAR/VARCHAR/TEXT。
选型建议:
- 查「以某字符串开头」→ 用
LIKE 'xxx%'+ 索引 - 查「包含某单词但位置不定」→ 建
FULLTEXT索引,用MATCH(title) AGAINST('word' IN NATURAL LANGUAGE MODE) - 查「符合复杂格式(如邮箱、手机号)」→ 用
REGEXP,但别在大表上频繁执行
真正容易被忽略的是:即使写了 LIKE 'abc%',如果字段用了函数包装(如 UPPER(name) LIKE 'ABC%'),索引也会失效。


















