MySQL字符集:utf8mb4_unicode_ci与"utf8mb4 - 默认字符集"的区别

28
请帮忙理解MySQL Workbench中列出的排序规则之间的区别: utf8mb4_unicode_ciutf8mb4 - default collation有什么区别?
附:所有人都建议使用utf8mb4_unicode_ci。既然这么受欢迎,为什么不是默认值?它与默认值有何不同?
我使用的是MySQL 5.7.21。
图片链接: MySQL Workbench

执行 SHOW CREATE TABLE 命令以发现实际的“默认”是什么。我认为它会显示 utf8mb4_general_ci 或者可能是 utf8mb4_unicode_520_ci。此外,这个默认值可能会随着 MySQL 版本的变化而改变。 - Rick James
1个回答

33

utf8mb4_default是什么?你在哪里看到的?

在MySQL 8.0之前,utf8mb4的默认排序规则是utf8mb4_general_ci。这个排序规则只逐字节比较,所以ssß不被认为是相等的。而大多数其他的utf8mb4排序规则都认为它们是相等的。

在通用使用(与特定于西班牙语等的排序规则相对)中,下一个更好的排序规则是utf8mb4_unicode_ci。它匹配了几年前编写的Unicode Collation Algorithm版本4.0。

然后是utf8mb4_unicode_520_ci(Unicode 5.20),它处理更多事情时更"正确"。

当你使用MySQL 8.0时,将会有一个9.0版本的utf8mb4_0900_ai_ci

有关差异的详细信息,请参阅http://mysql.rjweb.org/utf8_collations.html。(注意:对于该页面提供的信息,“utf8”与“utf8mb4”是相同的。)首先要注意的是:
utf8_general_ci         A=a=À=Á=Â=Ã=Ä=Å=à=á=â=ã=ä=å=Ā=ā=Ą=ą    Aa  ae          az
utf8_unicode_ci       A=a=ª=À=Á=Â=Ã=Ä=Å=à=á=â=ã=ä=å=Ā=ā=Ą=ą  Aa  ae          az            Æ=æ
utf8_unicode_520_ci   A=a=ª=À=Á=Â=Ã=Ä=Å=à=á=â=ã=ä=å=Ā=ā=Ą=ą  Aa  ae=Æ=æ      az

这3行指出了对Ææ的3种不同处理方式。
  • 这两个连字被视为相等("不区分大小写")。
  • general 不会将其排序在其他A的附近。(稍后我们会看到它们在Z之后排序。)
  • unicode 将它们排序在所有A之后,紧接着B,就好像它们是一个独立的“字母”。
  • unicode_520 将它们视为与字母对ae相等。

对于5.7版本,并且没有特定的语言要求,我会使用utf8mb4_unicode_520_ci

回到你关于“为什么”的问题。更改默认设置可能会对现有安装造成更多伤害而不是帮助。所以,我想设计者们比较保守。另一方面,8.0版本有很多重大变化,所以对于更改没有那么多的顾虑。因此,转向了utf8mb4_0900_ai_ci。


2
谢谢您的回答,请看一下我附在问题上的图片。 - Yevgeniy Afanasyev
我没有 utf8mb4_unicode_520_ci。我只有 utf8mb4_unicode_ciutf8mb4_default - 我找不到任何关于 utf8mb4_default 在上下文中是什么意思的描述。谢谢。 - Yevgeniy Afanasyev
1
@YevgeniyAfanasyev - 现在我看到这张图片,我会说它是一个懒散的列表。它没有说utf8mb4_default,而是说utf8mb4 - “default”排序规则,这是一件愚蠢的事情,因为它并没有给你任何线索来确定哪个是默认值。而且我认为列表中有错误。请在bugs.mysql.com上针对Workbench提交错误报告。 - Rick James
1
谢谢。那么我的问题是合理的,不仅我看不出哪一个是默认的。谢谢。 - Yevgeniy Afanasyev
SHOW COLLATION LIKE 'utf8mb4%'; - Rick James
显示剩余2条评论

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