发布日期:2018-03-26
utf8-general-ci和utf8-unicode-ci的区别是什么?+ 查看更多
utf8-general-ci和utf8-unicode-ci的区别是什么?
+ 查看更多
发布日期:2018-02-22 15:33
分类:SQL
浏览次数:804
utf8-general-ci与utf8-unicode-ci在性能方面有差别么?
回答
它们都是针对utf8编码的,区别在于如何对文本进行排序和比较。
注意:自从MySQL 5.5.3以来,你应该使用utf8mb4而不是utf8。它们都指的是UTF-8编码,但是较旧的utf8有一个MySQL特有的限制,用来防止使用高于0xFFFD的字符。
1.准确性
utf8mb4_unicode_ci是基于用于排序和比较的Unicode标准,可在非常广泛的语言中精确排序。而utf8mb4_general_ci无法实现所有Unicode排序规则,这将导致在某些情况下(例如使用特定语言或字符时)出现错误的排序。
2.性能
utf8mb4_general_ci在比较和排序时速度更快,因为它采取了一系列和性能相关的便捷方式。在现代服务器上,这种性能提升将几乎可以忽略不计。这是在服务器只有当今CPU的一小部分性能的时间段设计的。
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排序之间可能有更多的区别。
utf8mb4_general_ci的适用性将在很大程度上取决于使用的语言。对于一些语言,它的表现十分不足。
你应该用什么?
几乎可以肯定没有理由使用utf8mb4_general_ci了,因为我们现在已经不是CPU速度很慢,所以性能很重要的时代了。你的数据库会被其他的瓶颈所限制而不是这个。
性能的差异只在特殊的场景有衡量的价值,如果你需要的话,你应该提前知道的。如果你的排序很慢,大部分是由你的索引或者查询引起的,更改排序函数不应该在你应该排查的问题列表中占据很高的优先级。
在过去,有些人建议使用utf8mb4_general_ci,除非准确的排序足够重要,足以抵消性能的成本。今天,性能成本几乎消失了,开发商更加认真地对待国际化。
还有一件事我要补充的是,即使你知道你的应用程序只支持英语,但它可能仍然需要处理人的名字,这通常可以包含其他语言中使用的字符,其中正确的排序是同样重要的。使用Unicode规则可以让你安心,因为聪明的Unicode人努力的工作使得它的排序正常工作。