[译文] MySQL:字符集、Unicode 和 UCA 兼容的排序规则

2天前 6.9k 0

在 MySQL 8.0(MySQL 数据库服务又名 MDS 的版本)中,默认字符集已从latin1更改为ut8mb4。默认排序规则是utf8mb4_0900_ai_ci但这意味着什么?为什么utf8mb4_0900_*是推荐的?

诸如utf8mb4_unicode_520_ci和utf8mb4_0900_ai_ci 之类的整理基于Unicode 整理算法(UCA)。归类中的数字定义了 UCA 版本:

  • hUCA 9.0.0(推荐)
    示例:utf8mb4_0900_ai_ci
  • UCA 5.2.0(不推荐,请参阅下面的问题)
    示例:utf8mb4_unicode_520_ci

MySQL 8.0 中的默认排序规则是utf8mb4_0900_ai_ci

现在让我们看看这些排序规则的用途。我们从创建这样的表开始:

CREATE TABLE
collation_ex
(

id
int NOT NULL AUTO_INCREMENT,

0900_ai_ci
varchar(50) CHARACTER SET utf8mb4

COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,

unicode_520_ci
varchar(50) CHARACTER SET utf8mb4

COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,

general_ci
varchar(50) CHARACTER SET utf8mb4

COLLATE utf8mb4_general_ci DEFAULT NULL,

PRIMARY KEY (
id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

我们可以看到我们有 3 个使用不同排序规则的 varchar 列,其中前两个是 UCA 兼容的(即使第二个更少)。

让我们看看该表的内容:

[译文] MySQL:字符集、Unicode 和 UCA 兼容的排序规则-1

现在让我们看看使用这些 varchar 列对它们进行排序时的区别:

[译文] MySQL:字符集、Unicode 和 UCA 兼容的排序规则-2

我们可以看到不同之处,并注意到使用默认 MySQL 8.0 排序规则(第一列上的utf8mb4_0900_ai_ci)进行排序是给出正确 结果的排序。这种符合 UCA 的归类将不同的“a”排序为“a”。我们还可以注意到日文字符排序的不同。

有关 MySQL 中 UCA 支持的更多信息以及为什么正确结果很重要,请查看我的工程团队同事之前的帖子:

寿司=啤酒?!MySQL 8.0 对 UTF8 支持的介绍
MySQL 8.0 排序规则:细节决定成败

让我们再看一个西里尔字符的例子来说明 Unicode 5.2 和 9.0 之间的区别:
[译文] MySQL:字符集、Unicode 和 UCA 兼容的排序规则-3

当然,如果不展示著名的Shushi = Beer示例,我就无法写一篇关于字符集和排序规则的博客文章:

[译文] MySQL:字符集、Unicode 和 UCA 兼容的排序规则-4

如果您不记得排序规则名称中的_as和_ci是什么意思,这意味着区分重音和不区分大小写。
Unicode 字符集上的重音敏感性可以用一些单词来说明,其中它的重要性:

[译文] MySQL:字符集、Unicode 和 UCA 兼容的排序规则-5

我希望这能澄清为什么使用符合 UCA 的排序规则(MySQL 8.0 中的默认设置)很重要,以及为什么我们专注于那些而不是不再关注不符合 UCA 的旧 utf8 排序规则。

目前 MySQL 8.0 支持 49 个与 UCA 9.0.0 兼容的 utf8mb4 排序规则。要获取列表,只需运行以下语句:

mysql> show collat​​ion like 'u%900%';

总之:我们建议使用:

  • utf8mb4_0900_ *
  • utf8mb4_bin请不要使用:
  • utf8_*(不支持表情符号,缺少 CJK 字符等)
  • utf8mb3(不支持表情符号,缺少 CJK 字符等)
  • utf8mb4_general_ci(有像上面解释的 Sushi-Beer 这样的问题)
  • utf8mb4_unicode_ci(有像上面解释的 Sushi-Beer 那样的问题)
  • utf8mb4_unicode_520_ci :(有像 Mother-Daddy issue 这样的问题,对于日语来说就像它匹配 p 音和 b 音的字符而无法解决)

相关文章

OCP 4.x 特性解读:可观测性、高可用和易用性全面升级
第 55 期:MySQL 频繁 Crash 怎么办?
openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存
Oracle 19C PDB迁移报错 ORA-17628: error 65338 returned by remote Oracle server
【ORACLE】Oracle数据库并发控制、多版本控制、数据库独立性与应用性能优化
Oracle 基础数据库服务新增 AMD VM 标准 E5 Flex 配置

发布评论