我一直在将一些大表从 latin1 转换为 utf8,发现与 this user 相同的问题.但是我从中转换的表具有排序规则 latin1_general_ci(或 latin_swedish_ci)。那么为什么MySQL在不同的字符集下对“case-insensitive”有不同的解释呢?因为 latin1 不检查 o=ö 或 o=oe,所以唯一的 latin1 索引会产生数千次冲突。
最佳答案
有两个原因:
大小写是语言环境的东西。不同的语言环境可以赋予不同的字符作为小写(或大写)。 IIRC 土耳其语 I
应将 ı
(U+0131 拉丁文小写字母 DOTLESS I)作为小写字母。参见例如Unicode Casemap FAQ .所以 _swedish_
是相关的。
此外,generic unicode 算法很复杂,并且从 Unicode 字符串映射到 Unicode 字符串。在其他字符集上使用它可能会导致问题(实现应该检查和处理转换后的大小写在原始字符集之外的情况)。此外,Unicode 是“现代的”,因此 MySQL 用户[确实]不希望 MySQL 将字符串相等性从一个版本更改为下一个版本(例如,pre-Unicode 到 Unicode-as-first-class-charset [顺便说一句,它不是然而如此]).
关于mysql - 为什么不区分大小写在 latin1 和 utf8 中不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49652885/