gpt4 book ai didi

mysql - utf8_general_ci 和 utf8_unicode_ci 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 12:47:18 27 4
gpt4 key购买 nike

之间utf8_general_ciutf8_unicode_ci ,在性能方面有什么区别吗?

最佳答案

对于那些在 2020 年或之后仍然提出这个问题的人来说,有更新的选项可能比这两者都更好。例如,utf8mb4_0900_ai_ci .
所有这些排序规则都是针对 UTF-8 字符编码的。区别在于文本的排序和比较方式。_unicode_ci_general_ci是两组不同的规则,用于根据我们期望的方式对文本进行排序和比较。较新版本的 MySQL 也引入了新的规则集,例如 _0900_ai_ci对于基于 Unicode 9.0 的等效规则 - 并且没有等效规则 _general_ci变体。现在阅读本文的人可能应该使用这些较新的排序规则之一而不是 _unicode_ci_general_ci .下面对那些较旧的排序规则的描述仅供引用。
MySQL 目前正在摆脱旧的、有缺陷的 UTF-8 实现。现在,您需要使用 utf8mb4而不是 utf8对于字符编码部分,以确保您获得固定版本。有缺陷的版本仍然是为了向后兼容,尽管它已被弃用。
主要区别

  • utf8mb4_unicode_ci基于官方 Unicode 规则进行通用排序和比较,可在多种语言中准确排序。
  • utf8mb4_general_ci是一组简化的排序规则,旨在尽其所能,同时采取许多旨在提高速度的捷径。它不遵循 Unicode 规则,在某些情况下会导致不受欢迎的排序或比较,例如在使用特定语言或字符时。
    在现代服务器上,这种性能提升几乎可以忽略不计。它是在服务器具有当今计算机 CPU 性能的一小部分的时代设计的。

  • utf8mb4_unicode_ci的好处在 utf8mb4_general_ci utf8mb4_unicode_ci ,它使用 Unicode 规则进行排序和比较,使用相当复杂的算法来正确排序各种语言和使用各种特殊字符。这些规则需要考虑特定语言的约定;不是每个人都按照我们所说的“字母顺序”对他们的角色进行排序。
    就拉丁(即“欧洲”)语言而言,Unicode 排序和简化 utf8mb4_general_ci 之间没有太大区别。在 MySQL 中排序,但还是有一些区别:
  • 例如,Unicode 排序规则将 "ß"排序为 "ss",将 "Œ"排序为 "OE",因为人们通常希望使用这些字符,而 utf8mb4_general_ci将它们作为单个字符排序(大概分别像“s”和“e”)。
  • 某些 Unicode 字符被定义为可忽略的,这意味着它们不应计入排序顺序,而应将比较转移到下一个字符。 utf8mb4_unicode_ci正确处理这些。

  • 在非拉丁语言中,例如亚洲语言或具有不同字母表的语言,Unicode 排序和简化 utf8mb4_general_ci 之间可能存在更多差异。排序。 utf8mb4_general_ci的适用性将在很大程度上取决于所使用的语言。对于某些语言,这将是相当不够的。
    你应该用什么?
    几乎可以肯定没有理由使用 utf8mb4_general_ci不再,因为我们已经忘记了 CPU 速度足够低以至于性能差异很重要的点。您的数据库几乎肯定会受到除此之外的其他瓶颈的限制。
    以前有人推荐使用 utf8mb4_general_ci除非准确排序非常重要以证明性能成本是合理的。如今,这种性能成本几乎消失了,开发人员正在更加认真地对待国际化。
    有一种观点认为,如果速度对您来说比准确性更重要,那么您最好根本不进行任何排序。如果您不需要算法准确,那么使算法更快是微不足道的。所以, utf8mb4_general_ci是出于速度原因可能不需要的折衷方案,并且可能也不适合准确性原因。
    我要补充的另一件事是,即使你知道你的应用程序只支持英语,它可能仍然需要处理人名,它通常可能包含其他语言中使用的字符,在这些语言中正确排序同样重要.对所有内容使用 Unicode 规则有助于让您高枕无忧,因为非常聪明的 Unicode 人员已经非常努力地使排序正常工作。
    零件是什么意思
    首先, ci用于不区分大小写的排序和比较。这意味着它适用于文本数据,大小写并不重要。其他类型的排序规则是 cs (区分大小写)用于区分大小写的文本数据,以及 bin ,对于编码需要匹配的地方,逐位匹配,适用于真正编码为二进制数据的字段(包括例如Base64)。区分大小写的排序会导致一些奇怪的结果,区分大小写的比较可能会导致重复值仅在字母大小写中不同,因此区分大小写的排序规则对文本数据不受欢迎——如果大小写对您很重要,那么其他情况下的标点符号可以忽略等等可能也很重要,二进制排序可能更合适。
    接下来, unicodegeneral指的是特定的排序和比较规则——特别是文本被规范化或比较的方式。 utf8mb4 字符编码有许多不同的规则集,如 unicodegeneral是两种尝试在所有可能的语言中都能很好地工作而不是一种特定的语言。这两组规则之间的差异是本答案的主题。请注意 unicode使用来自 Unicode 4.0 的规则。 MySQL 的最新版本添加了规则集 unicode_520使用来自 Unicode 5.2 和 0900 的规则(删除“unicode_”部分)使用来自 Unicode 9.0 的规则。
    最后, utf8mb4当然是内部使用的字符编码。在这个答案中,我只谈论基于 Unicode 的编码。

    关于mysql - utf8_general_ci 和 utf8_unicode_ci 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/766809/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com