SQL使用LIKE '%_12_%'查询时返回非预期结果原因排查
问题根因
你遇到的匹配错误是SQL LIKE 运算符的通配符规则导致的:
- SQL标准中,
LIKE支持两个通配符:%:匹配0个及以上任意字符_:匹配恰好1个任意字符
你写的查询条件models LIKE '%_12_%'并没有按照预期匹配包含字面量_12_的字符串,实际匹配规则是:
任意长度前缀 + 1个任意字符 + 字符串
12+ 1个任意字符 + 任意长度后缀
只要符合这个规则的models值都会被命中,比如a12b、iPhone12x、x123都会被匹配到,因此返回了不属于iPhone12系列的颜色数据。
修复方案
如果需要匹配字面量的下划线_,需要对下划线进行转义,常用的转义方式如下:
MySQL环境(默认反斜杠为转义符)
直接对要识别为字面量的下划线加反斜杠转义即可:
SELECT * FROM `iphone_colors` WHERE `cat_id` = 9 AND `models` LIKE '%\_12\_%'
通用SQL标准写法(兼容所有数据库)
通过ESCAPE关键字自定义转义符,避免不同数据库转义默认规则差异的影响:
-- 这里用#作为转义符,也可以换成其他不常用的特殊字符 SELECT * FROM `iphone_colors` WHERE `cat_id` = 9 AND `models` LIKE '%#_12#_%' ESCAPE '#'
修改后查询就只会匹配models字段包含字面量_12_的记录,仅返回iPhone12系列对应的颜色数据。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

