python3 -c "print(len('İ'.lower()), 'İ'.lower()=='i')"
python3 -c "import unicodedata as u;print(u.normalize('NFD','é')==u.normalize('NFC','é'))"

地址去重拿 name.lower() 当 key,伊斯坦布尔那条始终留着两条,原值一个带 İ 一个带 i。两边 lower 后看着一样,长度却差了 1。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:土耳其语的大写 İ 小写是 i 加一个组合点,不是一个字符。lower() 展开成两个码位后,和普通的 i 不再相等,集合里就多留了一份。

「大小写折叠」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:比较前先 casefold() 它按完整大小写折叠处理特殊字母;再统一走 NFC 规范化 把组合字符合成一个;去重 key 落库时存规范化之后的串;把 İ I ı i 四种写法都写进用例。

确认没问题再收工,四条伊斯坦布尔记录去重后只剩一条 保留最早写入的那条原值。

作者 9823189