用户输入 测试(新版),库里存的是 测试(新版),like 查询返回 0 条,把括号换成半角立刻能搜到。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,全角括号是 U+FF08 和 U+FF09,和半角 U+0028 是两个不同码点,字符串比较不会自动等价。数据库的 collation 也不做全半角折叠。

「全角括号匹配」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。报错里带路径的,先去看那个路径在不在、权限对不对。

python -c "import unicodedata; print(unicodedata.normalize('NFKC','测试(新版)'))"
SELECT id FROM articles WHERE title_norm LIKE '%测试(新版)%';

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,入库前做 NFKC 归一化 把全角转半角;查询词同样归一化 两边用同一套规则;已有数据跑一次批量归一化脚本;归一化后建索引 保证查询走索引。

最后用这个标准收尾,全角输入能搜到半角记录 归一化列的查询计划命中索引。

作者 9823189