在 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 兼容的(即使第二个更少)。
让我们看看该表的内容:
现在让我们看看使用这些 varchar 列对它们进行排序时的区别:
我们可以看到不同之处,并注意到使用默认 MySQL 8.0 排序规则(第一列上的utf8mb4_0900_ai_ci)进行排序是给出正确 结果的排序。这种符合 UCA 的归类将不同的“a”排序为“a”。我们还可以注意到日文字符排序的不同。
有关 MySQL 中 UCA 支持的更多信息以及为什么正确结果很重要,请查看我的工程团队同事之前的帖子:
寿司=啤酒?!MySQL 8.0 对 UTF8 支持的介绍
MySQL 8.0 排序规则:细节决定成败
让我们再看一个西里尔字符的例子来说明 Unicode 5.2 和 9.0 之间的区别:
当然,如果不展示著名的Shushi = Beer示例,我就无法写一篇关于字符集和排序规则的博客文章:
如果您不记得排序规则名称中的_as和_ci是什么意思,这意味着区分重音和不区分大小写。
Unicode 字符集上的重音敏感性可以用一些单词来说明,其中它的重要性:
我希望这能澄清为什么使用符合 UCA 的排序规则(MySQL 8.0 中的默认设置)很重要,以及为什么我们专注于那些而不是不再关注不符合 UCA 的旧 utf8 排序规则。
目前 MySQL 8.0 支持 49 个与 UCA 9.0.0 兼容的 utf8mb4 排序规则。要获取列表,只需运行以下语句:
mysql> show collation 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 音的字符而无法解决)