You need to enable JavaScript to run this app. MySQL中使用LIKE命令检索含%、_、.、?等特殊字符名称的方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 23:06:05