like语法中的百分号和下划线如何使用_mysql模糊匹配规则

来源:这里教程网 时间:2026-02-28 20:36:55 作者:

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

实际用的时候,先想清楚你要的是“长度可控的单字占位”还是“任意长度伸缩”,再选

_
还是
%
;只要模式里出现这两个符号,就必须同步检查是否要转义、是否影响索引、字段内容里是否真有这些字符。

相关推荐