后台按商品名搜索 iPhone 15,输入看着和库里一样,返回 0 条。把字符串按字节打印,空格位置是 c2 a0 而不是 20。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,网页里的 是不换行空格 U+00A0,肉眼和普通空格无差别,比较时是两个不同字符。trim 默认也不去掉它。
碰到「NBSP 不换行空格」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
python -c "print(repr('iPhone\u00a015'))"
SELECT id FROM goods WHERE replace(name, UNHEX('C2A0'), ' ') LIKE '%iPhone 15%';
UPDATE goods SET name = replace(name, UNHEX('C2A0'), ' ');
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,输入侧统一把 U+00A0 替换成普通空格;用 NFKC 归一化处理全角空格和 NBSP;历史数据跑一次清洗 去掉首尾不可见字符;搜索前对关键词做同样的处理。
最后用这个标准收尾,带 NBSP 的关键词能搜到记录 库里该字段不再包含 c2a0 字节。
