You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL精确匹配失效仅%LIKE%生效的问题排查与解决

解决ASIN列精确查询无结果的问题

问题场景

我之前碰到过一模一样的坑:维护的products_stock表里,asin列是varchar(255) utf8_general_ci类型,用来存储亚马逊ASIN码。当我尝试用精确查询查找B074SJBC53时,不管是用=还是不带通配符的LIKE,都查不到任何结果:

SELECT * FROM products_stock WHERE asin LIKE 'B074SJBC53';
SELECT * FROM products_stock WHERE asin = 'B074SJBC53';

只有加了前后通配符的模糊查询能命中目标记录:

SELECT * FROM products_stock WHERE asin LIKE '%B074SJBC53%';

但这种方式太不严谨,很容易匹配到无关的ASIN。我甚至在phpMyAdmin里直接复制表中显示的精确ASIN值来查询,依然没有结果,而且反复确认了值的前后没有可见空格或者明显的隐藏字符。

排查与解决过程

折腾半天后才反应过来,大概率是不可见的控制字符在搞鬼——像换行符、制表符、空字符这类东西,肉眼完全看不到,但会彻底破坏字符串的精确匹配逻辑。

我用PHP的preg_replace函数批量清理了整个asin列的控制字符,核心代码逻辑如下:

// 遍历从数据库取出的每条记录,清理ASIN中的控制字符
$cleanedAsin = preg_replace('/[[:cntrl:]]/', '', $all['asin']);
// 执行UPDATE语句将清理后的值更新回数据库

更新完成后再试精确查询,SELECT * FROM products_stock WHERE asin = 'B074SJBC53'一下子就返回了对应的记录!

总结提示

如果遇到字符串精确匹配失效但模糊匹配有效的情况,排除了可见空格后,一定要优先考虑不可见控制字符的问题。正则表达式[[:cntrl:]]可以匹配所有ASCII控制字符(ASCII码0-31和127),用它来清理字符串就能解决这类隐藏字符导致的匹配异常。

内容的提问来源于stack exchange,提问作者Jaycaponex

火山引擎 最新活动