MySQL 中的
LIKE是最常用的模糊查询方式,核心在于正确使用通配符和注意性能陷阱。
LIKE 基础语法与通配符含义
LIKE后跟一个模式字符串,支持两个关键通配符: %:匹配任意长度的字符(包括零个字符),例如
'abc%'匹配以
abc开头的所有字符串 _:匹配单个任意字符,例如
'a_c'匹配
abc、
a2c,但不匹配
ac或
abcd
注意:默认区分大小写取决于字段的排序规则(collation),如需忽略大小写,可使用
LOWER()或确保列使用
utf8mb4_general_ci类型排序规则。
常用模糊匹配场景写法
根据搜索需求选择合适模式:
查包含某子串:WHERE name LIKE '%keyword%'查以某字符串开头:
WHERE name LIKE 'prefix%'(推荐,可能走索引) 查以某字符串结尾:
WHERE name LIKE '%suffix'(无法使用普通索引,慎用) 查固定长度+部分已知:
WHERE code LIKE 'A_202_'(匹配如
A12024、
A92021)
若需匹配字面意义的
%或
_,用
ESCAPE指定转义符,例如:
LIKE '100\%' ESCAPE '\'。
提升 LIKE 查询性能的关键点
模糊查询容易拖慢数据库,尤其大数据量时:
前导通配符(如'%abc'或
'%abc%')会使 B+ 树索引失效,只能全表扫描 只有
'abc%'这类左匹配才可能利用索引(前提是字段有索引且未在函数中使用) 考虑替代方案:对高频模糊检索字段,可建立全文索引(FULLTEXT)配合
MATCH ... AGAINST,更适合自然语言搜索 数据量极大时,引入 Elasticsearch 或 RedisSearch 等专用检索引擎更高效
避免常见错误
实际写 SQL 时常踩这些坑:
忘记加引号导致语法错误:WHERE name LIKE abc%❌ 应为
WHERE name LIKE 'abc%'✅ 在
LIKE中误用变量拼接引发 SQL 注入(尤其 PHP/Java 拼接字符串时),务必使用预处理参数化查询 对 NULL 值使用
LIKE返回 FALSE,需单独判断:
WHERE name IS NULL OR name LIKE '%x%'中文模糊搜索时,确认字符集是
utf8mb4,避免乱码或匹配失败
