MySQL中使用LIKE命令检索含%、_、.、?等特殊字符名称的方法
MySQL 用 LIKE 精准匹配含特殊字符存储值的实操方法
MySQL 的 LIKE 语法本身定义了两个专属通配符,这也是这类匹配问题的核心根源:
%会被解析为「匹配任意长度(含0长度)的任意字符」_会被解析为「匹配1个固定长度的任意字符」
而题目里提到的 .、? 本身不是 LIKE 语法的特殊通配符,正常写在匹配条件里就会被当成普通字符匹配,不需要额外处理,真正需要做特殊转义的只有和通配符同名的 %、_ 字符。
基础转义写法(MySQL 默认规则)
MySQL 默认用反斜杠 \ 作为转义标识符,只要把要匹配的字面量通配符前面加上转义符,就会把该字符当成普通文本处理:
- 要匹配真实的
%字符:写成\% - 要匹配真实的
_字符:写成\_
举个实际场景例子:如果要检索「名称列里包含 _付费用户%等级 片段」的记录,匹配条件就不能直接写 LIKE '%_付费用户%等级%'——因为开头的_会被当成单字符通配符,中间的%会被当成长度通配符,会检索到大量不符合预期的结果。正确的写法是:
SELECT * FROM 指定表名 WHERE 名称 LIKE '%\_付费用户\%等级%'
这里要额外注意:如果存储的原始值本身就带反斜杠\,那转义符本身也要做二次转义,也就是写\\,不然会被当成普通文本而非转义标识。
自定义转义符的避坑写法
如果碰到原始存储值本身就大量带反斜杠的场景,用默认转义符会导致大量重复的\堆叠,可读性很差还容易写错,这时候可以用ESCAPE关键字手动指定一个不会出现在存储值里的字符当转义标识。
比如指定!作为转义符,同样匹配上面的_付费用户%等级片段,写法就是:
SELECT * FROM 指定表名 WHERE 名称 LIKE '%!_付费用户!%等级%' ESCAPE '!'
这种写法下,所有紧跟在!后面的%、_都会被识别为普通文本,没有反斜杠堆叠的问题,可读性会高很多。
常见踩坑提示
- 不要把正则的通配规则套到LIKE上:
.、?在LIKE里就是普通字符,不需要转义,硬加转义反而会触发未知的解析错误。 - 如果业务场景是要完全匹配某个固定的名称值,优先用等值判断(
=)或者IN查询,比LIKE的性能更好,还完全不用处理转义逻辑,只有需要模糊匹配前后缀、中间片段的时候才值得用LIKE。 - 拼接LIKE条件的时候一定要做转义处理,不要直接把用户输入的特殊字符拼到匹配串里,不然会出现通配符逻辑泄露的问题,甚至拖慢全表扫描的效率。
内容的提问来源于stack exchange,提问作者Vaibhav Gupta
相关产品推荐
相关产品推荐

