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

2024年 6月 30日 65.0k 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 音的字符而无法解决)

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论