utf8_general_ci和之间utf8_unicode_ci,在性能方面有什么区别吗?
utf8_general_ci
utf8_unicode_ci
对于那些在 2020 年或之后仍会遇到这个问题的人,有更新的选项可能比 这两者都 好。例如,utf8mb4_0900_ai_ci。
utf8mb4_0900_ai_ci
所有这些排序规则都用于 UTF-8 字符编码。不同之处在于文本的排序和比较方式。
_unicode_ci并且_general_ci是根据我们期望的方式对文本进行排序和比较的两组不同的规则。较新版本的 MySQL 也引入了新的规则集,例如_0900_ai_ci基于 Unicode 9.0 的等效规则 - 并且没有等效_general_ci变体。现在阅读本文的人可能应该使用这些较新的排序规则之一,而不是使用_unicode_cior _general_ci。下面对那些较旧的排序规则的描述仅供参考。
_unicode_ci
_general_ci
_0900_ai_ci
MySQL 目前正在从旧的、有缺陷的 UTF-8 实现过渡。 现在,您需要使用utf8mb4而不是utf8字符编码部分,以确保您获得的是固定版本。有缺陷的版本仍然是为了向后兼容,尽管它已被弃用。
utf8mb4
utf8
主要区别
utf8mb4_unicode_ci基于官方 Unicode 规则进行通用排序和比较,可在多种语言中准确排序。
utf8mb4_unicode_ci
utf8mb4_general_ci是一组简化的排序规则,旨在尽其所能,同时采取许多旨在提高速度的捷径。它不遵循 Unicode 规则,并且在某些情况下会导致不需要的排序或比较,例如在使用特定语言或字符时。
utf8mb4_general_ci
在现代服务器上,这种性能提升几乎可以忽略不计。它是在服务器的 CPU 性能只有当今计算机的一小部分时设计的。
utf8mb4_unicode_ci 超过的好处utf8mb4_general_ci
utf8mb4_unicode_ci使用 Unicode 规则进行排序和比较,使用相当复杂的算法在多种语言中正确排序以及在使用多种特殊字符时进行正确排序。这些规则需要考虑特定语言的约定;不是每个人都按照我们所说的“字母顺序”对他们的字符进行排序。
就拉丁语(即“欧洲”)语言而言,Unicode 排序和 MySQL 中的简化排序没有太大区别utf8mb4_general_ci,但仍有一些区别:
例如,Unicode 排序规则将“脽”排序为“ss”,将“艗”排序为“OE”,因为使用这些字符的人通常会想要,而将utf8mb4_general_ci它们排序为单个字符(大概分别像“s”和“e”) .
一些 Unicode 字符被定义为可忽略的,这意味着它们不应该计入排序顺序,并且比较应该转移到下一个字符。 utf8mb4_unicode_ci妥善处理这些。
在非拉丁语言中,例如亚洲语言或具有不同字母的语言,Unicode 排序和简化排序之间可能存在 更多 差异utf8mb4_general_ci。will的适用性在utf8mb4_general_ci很大程度上取决于所使用的语言。对于某些语言,这将是非常不充分的。
你应该用什么?
几乎可以肯定没有理由再使用utf8mb4_general_ci了,因为我们已经忽略了 CPU 速度足够低以至于性能差异很重要的点。您的数据库几乎肯定会受到除此之外的其他瓶颈的限制。
过去,有些人建议使用,utf8mb4_general_ci除非准确排序足够重要以证明性能成本是合理的。如今,这种性能成本几乎消失了,开发人员正在更加认真地对待国际化。
有一个论点是,如果速度对您来说比准确性更重要,那么您可能根本不进行任何排序。如果您不需要准确的算法,那么使算法更快是微不足道的。因此,utf8mb4_general_ci出于速度原因可能不需要妥协,也可能出于准确性原因也不适合。
我要补充的另一件事是,即使您知道您的应用程序只支持英语,它可能仍需要处理人名,这些人名通常包含其他语言中使用的字符,在这些语言中正确排序同样重要. 对所有事情都使用 Unicode 规则有助于让您更加安心,因为非常聪明的 Unicode 人员已经非常努力地工作以使排序正常工作。
零件是什么意思
首先,ci用于 不区分大小写的 排序和比较。这意味着它适用于文本数据,大小写并不重要。其他类型的排序规则是cs(区分大小写)对于大小写很重要的文本数据bin,对于需要匹配编码的情况,逐位匹配,这适用于真正编码二进制数据的字段(包括,例如, Base64)。区分大小写的排序会导致一些奇怪的结果,区分大小写的比较可能会导致重复值仅在字母大小写上有所不同,因此区分大小写的排序规则对文本数据不受欢迎 - 如果大小写对您很重要,那么标点符号就可以忽略等等可能也很重要,二进制排序规则可能更合适。
ci
cs
bin
接下来,unicodeorgeneral指的是具体的排序和比较规则——特别是文本被规范化或比较的方式。utf8mb4 字符编码有许多不同的规则集,其中unicode和general为两个试图在所有可能的语言中都很好地工作,而不是在一种特定的语言中。这两组规则之间的差异是此答案的主题。请注意,unicode使用 Unicode 4.0 中的规则。MySQL 的最新版本unicode_520使用 Unicode 5.2 中的规则添加规则集,并且0900(删除“unicode_”部分)使用 Unicode 9.0 中的规则。
unicode
general
unicode_520
0900
最后,utf8mb4当然是内部使用的字符编码。在这个答案中,我只谈论基于 Unicode 的编码。