【问题标题】:Why is case-insensitive different in latin1 and utf8?为什么 latin1 和 utf8 不区分大小写?
【发布时间】:2018-09-14 03:02:01
【问题描述】:

我一直在将一些大表从 latin1 转换为 utf8 并发现与 this user 相同的问题。但是我要转换的表具有排序规则 latin1_general_ci(或 latin_swedish_ci)。那么为什么MySQL在不同的字符集中对“不区分大小写”有不同的解释呢?因为 latin1 不检查 o=ö 或 o=oe 一个唯一的 latin1 索引可以建立数以千计的冲突。

【问题讨论】:

    标签: mysql utf-8 collation iso-8859-1


    【解决方案1】:

    有两个原因:

    大小写是一种语言环境的东西。不同的语言环境可能会给出不同的字符作为小写(或大写)。 IIRC 土耳其语 I 应该有 ı (U+0131 拉丁小写字母 DOTLESS I) 作为小写字母。参见例如Unicode Casemap FAQ。所以_swedish_ 是相关的。

    另外,generic unicode 算法很复杂,从 Unicode 字符串映射到 Unicode 字符串。在其他字符集上使用它可能会导致问题(实现应该检查和处理转换后的情况在原始字符集之外的情况)。此外,Unicode 是“现代的”,所以 MySQL 用户确实[不希望] MySQL 将字符串相等性从一个版本更改为下一个版本(例如 pre-Unicode 到 Unicode-as-first-class-charset [顺便说一句,它不是仍然如此])。

    【讨论】:

    • 我同意存在语言环境问题,我很惊讶使用例如utf8_german2.ci 没有帮助(尽管有问题的表格不在此范围内)。但是您问题的第二部分似乎说 latin1 可以追溯到任何人考虑这一点之前,他们不想更改它,因为它可能会破坏许多现有数据库。还有比这更好的理由吗?
    • 我必须准确测试哪些字符的解释不同。 Unicode 试图有一个更合理的算法,它可以通用地用于所有语言。 Latin1 更注重一​​些西欧的整理规则。
    • 我没有做过详尽的测试,但总的来说在 latin1 'a'!='á', 'e'!='è', 'i'!='î', 'o '!='ö' 等,而在 utf-8 中这些都是相等的。
    • 我错了,来自 mysql:“xxx_general_mysql500_ci 排序规则保留了原始 xxx_general_ci 排序规则的 5.1.24 之前的排序,并允许升级在 MySQL 5.1.24 之前创建的表”,所以稳定性不是一个问题。
    • 我也错了uf8_generic_ci 使用 unicode 算法。(uf8_unicode_ci 这样做)。所以是纯mysql的实现细节。有关一些描述,请参阅dev.mysql.com/doc/refman/5.7/en/charset-unicode-sets.html,但没有关于 latin1_generic (dev.mysql.com/doc/refman/5.7/en/charset-we-sets.html) 的原因。
    【解决方案2】:

    带有语言名称或国家/地区代码的排序规则是针对该语言量身定制的。例如,瑞典语将 Å(A 环)排序在 Z(“超越斑马”?)之后,大多数其他语言将其排序与 A 相同。

    请注意,有几种不同的 latin1 排序规则,以及许多 utf8 排序规则。

    我记录了utf8_general_mysql500_ci 的历史和ß here 的问题。

    MySQL 的 ...general... 排序规则一次只查看一个字节,因此将“oe”或“ss”或“ll”始终视为 2 个字母。 'General' 更快,但很少有用。

    ...bin 只检查字节。没有外壳折叠;没有重音剥离。

    MySQL 在几乎所有排序规则中都将大小写折叠和重音去除联系在一起 (...ci)。只有几个...cs('区分大小写')。

    查看各种 utf8 排序规则中的相等或不相等:http://mysql.rjweb.org/utf8_collations.html
    对于 utf8mb4 (MySQL 8.0):http://mysql.rjweb.org/utf8mb4_collations.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2011-02-12
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多