Unicode 标准包括来自基本多语言平面 (BMP) 的字符以及位于 BMP 之外的补充字符。本节介绍 MySQL 中对 Unicode 的支持。有关 Unicode 标准本身的信息,请访问 Unicode 联盟网站。
BMP 字符具有以下特征
它们的代码点值介于 0 到 65535 之间(或
U+0000
和U+FFFF
)。它们可以使用可变长度编码进行编码,使用 8、16 或 24 位(1 到 3 个字节)。
它们可以使用固定长度编码进行编码,使用 16 位(2 个字节)。
它们足以满足大多数主要语言中的几乎所有字符。
补充字符位于 BMP 之外
它们的代码点值介于
U+10000
和U+10FFFF
之间。对补充字符的 Unicode 支持需要具有超出 BMP 字符范围的字符集,因此比 BMP 字符占用更多空间(每个字符最多 4 个字节)。
UTF-8(使用 8 位单元的 Unicode 转换格式)对 Unicode 数据的编码方法是根据 RFC 3629 实现的,RFC 3629 描述了占用 1 到 4 个字节的编码序列。UTF-8 的理念是,使用不同长度的字节序列对各种 Unicode 字符进行编码
基本拉丁字母、数字和标点符号使用一个字节。
大多数欧洲和中东脚本字母适合 2 字节序列:扩展拉丁字母(带波浪号、长音符、锐音符、重音符和其他重音符)、西里尔字母、希腊字母、亚美尼亚字母、希伯来字母、阿拉伯字母、叙利亚字母等。
韩语、中文和日文表意文字使用 3 字节或 4 字节序列。
MySQL 支持以下 Unicode 字符集
utf8mb4
:使用每个字符 1 到 4 个字节的 Unicode 字符集的 UTF-8 编码。utf8mb3
:使用每个字符 1 到 3 个字节的 Unicode 字符集的 UTF-8 编码。此字符集已弃用,将在未来版本中删除;请改用utf8mb4
。utf8
:utf8mb3
的过时别名;请改用utf8mb4
。注意在未来的 MySQL 版本中,预计
utf8
将成为utf8mb4
的别名。ucs2
:使用每个字符 2 个字节的 Unicode 字符集的 UCS-2 编码。已弃用;预计在未来版本中将删除对该字符集的支持。utf16
:Unicode 字符集的 UTF-16 编码,使用每个字符 2 或 4 个字节。与ucs2
相似,但为补充字符扩展了支持。utf16le
:Unicode 字符集的 UTF-16LE 编码。与utf16
相似,但使用小端字节序而不是大端字节序。utf32
:使用每个字符 4 个字节的 Unicode 字符集的 UTF-32 编码。
utf8mb3
字符集已弃用,预计将在未来的 MySQL 版本中删除。请改用 utf8mb4
。目前,utf8
是 utf8mb3
的别名,但现在此别名也已弃用,预计 utf8
随后将成为对 utf8mb4
的引用。MySQL 8.4 还在信息模式表中的列以及 SQL SHOW
语句的输出中显示 utf8mb3
代替 utf8
。
此外,您还应注意,在旧版本的 MySQL 中使用 utf8_
前缀的排序规则现在已使用前缀 utf8mb3_
重命名。
为了避免对 utf8
的含义产生歧义,请考虑为字符集引用显式指定 utf8mb4
。
表 12.2, “Unicode 字符集的一般特征” 总结了 MySQL 支持的 Unicode 字符集的一般特征。
表 12.2 Unicode 字符集的一般特征
字符集 | 支持的字符 | 每个字符所需的存储空间 |
---|---|---|
utf8mb3 ,utf8 (已弃用) |
仅限 BMP | 1、2 或 3 个字节 |
ucs2 |
仅限 BMP | 2 个字节 |
utf8mb4 |
BMP 和补充 | 1、2、3 或 4 个字节 |
utf16 |
BMP 和补充 | 2 或 4 个字节 |
utf16le |
BMP 和补充 | 2 或 4 个字节 |
utf32 |
BMP 和补充 | 4 个字节 |
BMP 之外的字符将比较为 REPLACEMENT CHARACTER
,并在转换为仅支持 BMP 字符的 Unicode 字符集(utf8mb3
或 ucs2
)时转换为 '?'
。
如果您使用支持补充字符的字符集,因此比仅限 BMP 的 utf8mb3
和 ucs2
字符集更“宽”,则您的应用程序可能会遇到兼容性问题;请参阅 第 12.9.8 节,“在 3 字节和 4 字节 Unicode 字符集之间转换”。该节还介绍了如何将表从(3 字节)utf8mb3
转换为(4 字节)utf8mb4
以及这样做时可能存在的限制。
大多数 Unicode 字符集都提供了一组类似的排序规则。例如,每个字符集都包含一个丹麦语排序规则,其名称分别为 utf8mb4_danish_ci
、utf8mb3_danish_ci
(已弃用)、utf8_danish_ci
(已弃用)、ucs2_danish_ci
、utf16_danish_ci
和 utf32_danish_ci
。唯一的例外是 utf16le
,它只有两个排序规则。有关 Unicode 排序规则及其差异属性(包括补充字符的排序规则属性)的信息,请参阅 第 12.10.1 节,“Unicode 字符集”。
MySQL 中的 UCS-2、UTF-16 和 UTF-32 实现以大端字节序存储字符,并且在值的开头不使用字节顺序标记 (BOM)。其他数据库系统可能使用小端字节序或 BOM。在这种情况下,在这些系统和 MySQL 之间传输数据时需要进行值转换。UTF-16LE 的实现使用小端字节序。
MySQL 不会为 UTF-8 值使用 BOM。
使用 Unicode 与服务器通信的客户端应用程序应相应地设置客户端字符集(例如,通过发出 SET NAMES 'utf8mb4'
语句)。某些字符集不能用作客户端字符集。尝试将它们与 SET NAMES
或 SET CHARACTER SET
一起使用会导致错误。请参阅 不允许的客户端字符集。
以下部分详细介绍了 MySQL 中的 Unicode 字符集。