utf8_unicode_ci和utf8mb4_0900_ai_ci之间有什么区别?

41

在 MySQL 中,utf8mb4_0900_ai_ciutf8_unicode_ci 数据库文本编码有什么区别(尤其是在性能方面)?

更新:

utf8mb4_unicode_ciutf8mb4_0900_ai_ci 之间是否存在类似的差异?


7
这是关于数据排序方式的对比规则。mbX 意为多字节(用 X 字节存储一个字符), 0900 是对比算法,ai 表示不区分重音,ci 表示不区分大小写。 - marekful
1个回答

78
  • 编码是相同的。也就是说,字节看起来是一样的。
  • 字符集是不同的。utf8mb4拥有更多的字符。
  • 排序规则(比较方式)是不同的。
  • 性能是不同的,但很少有影响。

utf8_unicode_ci表示CHARACTER SET utf8,它只包含1、2和3字节的UTF-8字符。因此,它不包括大多数表情符号和一些中文字符。

utf8mb4_unicode_ci表示CHARACTER SET utf8mb4是4字节CHARACTER SET utf8mb4的相应COLLATION

Unicode组织多年来一直在演变其规范。以下是从其“版本”到MySQL排序规则的映射:

4.0   _unicode_
5.2.0 _unicode_520_ (Unicode 2009; MySQL GA 5.6 2013)
9.0   _0900_
14.0  _uca1400_ai_ci etc.  as/ai and cs/ci (MariaDB-10.10, not MySQL)

大多数差异将出现在大多数人从未遇到的领域。一个例子是:在某个时候,一项变更允许以某种方式区分和排序Emoji。
后缀(MySQL文档):
_bin      -- just compare the bits; don't consider case folding, accents, etc
_ci       -- explicitly case insensitive (A=a) and implicitly accent insensitive (a=á)
_ai_ci    -- explicitly case insensitive and accent insensitive
_as (etc) -- accent-sensitive (etc)

表现:
_bin         -- simple, fast
_general_ci  -- fails to compare multiple letters; eg ss=ß, so somewhat fast
...          -- slower
_900_        -- (8.0) much faster because of a rewrite

然而:在查询中,整理速度通常是性能问题中最不重要的。索引、连接、子查询、表扫描等对性能的影响更为关键。

4
utf8mb4_unicode_ciutf8mb4_0900_ai_ci 之间存在类似的差异吗? - Kamil Kiełczewski
1
@KamilKiełczewski - 是的。 - Rick James
2
@BugWhisperer - "utf8mb4" 最大的字符长度为4个字节。这适用于所有 utf8mb4 的排序规则("utf8mb4_*",包括那个)。 - Rick James
2
@Stalinko - 来自OracleOpenWorld。一个开发者指出8.0对排序代码进行了大幅重写,并指出它运行速度更快。(我还没有设计出现实的测试用例来验证或量化这种加速。) - Rick James
2
@Stalinko - 在转换之前和之后测量时间。然后告诉我们。 - Rick James
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接