- 12.9.1 utf8mb4 字符集 (4 字节 UTF-8 Unicode 编码)
- 12.9.2 utf8mb3 字符集 (3 字节 UTF-8 Unicode 编码)
- 12.9.3 utf8 字符集 (已弃用的 utf8mb3 别名)
- 12.9.4 ucs2 字符集 (UCS-2 Unicode 编码)
- 12.9.5 utf16 字符集 (UTF-16 Unicode 编码)
- 12.9.6 utf16le 字符集 (UTF-16LE Unicode 编码)
- 12.9.7 utf32 字符集 (UTF-32 Unicode 编码)
- 12.9.8 在 3 字节和 4 字节 Unicode 字符集之间转换
Unicode 标准包括基本多语言平面 (BMP) 和补充字符,这些字符位于 BMP 之外。本节描述 MySQL 中的 Unicode 支持。有关 Unicode 标准本身的信息,请访问 Unicode Consortium 网站。
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(Unicode 转换格式,使用 8 位单元)方法用于编码 Unicode 数据,按照 RFC 3629 实现,该方法描述了一到四个字节的编码序列。UTF-8 的想法是使用不同长度的字节序列来编码各种 Unicode 字符:
-
基本拉丁字母、数字和标点符号使用一个字节。
-
大多数欧洲和中东脚本字母可以用 2 字节序列表示:扩展拉丁字母(带有波浪号、宏、尖音符、重音符等)、西里尔字母、希腊字母、亚美尼亚字母、希伯来字母、阿拉伯字母、叙利亚字母等。
-
韩文、中文和日文汉字使用 3 字节或 4 字节序列。
MySQL 支持以下 Unicode 字符集:
-
utf8mb4
:使用 1 到 4 字节每个字符的 Unicode 字符集的 UTF-8 编码。 -
utf8mb3
:使用 1 到 3 字节每个字符的 Unicode 字符集的 UTF-8 编码。该字符集已弃用,建议使用utf8mb4
。 -
utf8
:utf8mb3
的弃用别名;建议使用utf8mb4
。Noteutf8
预计在未来 MySQL 版本中将成为utf8mb4
的别名。 -
ucs2
:Unicode 字符集的 UCS-2 编码,使用 2 字节每个字符。弃用;预计在未来版本中删除对该字符集的支持。 -
utf16
:Unicode 字符集的 UTF-16 编码,使用 2 或 4 字节每个字符。类似于ucs2
,但具有补充字符的扩展。 -
utf16le
:Unicode 字符集的 UTF-16LE 编码。类似于utf16
,但小端序而不是大端序。 -
utf32
:Unicode 字符集的 UTF-32 编码,使用 4 字节每个字符。
utf8mb3
字符集已弃用,建议使用 utf8mb4
。 utf8
目前是 utf8mb3
的别名,但它现在已弃用,预计将来 utf8
将成为 utf8mb4
的引用。MySQL 8.3 也将在信息模式表的列和 SQL SHOW
语句的输出中显示 utf8mb3
,而不是 utf8
。
此外,您应该了解的是,在旧版本的 MySQL 中使用 utf8_
前缀的排序规则已经被重命名为使用 utf8mb3_
前缀。
为了避免关于 utf8
的含义的歧义,请考虑明确指定 utf8mb4
作为字符集引用。
表 12.2,“Unicode 字符集通用特征”,总结了 MySQL 支持的 Unicode 字符集的通用特征。
表 12.2 Unicode 字符集通用特征
Character Set | Supported Characters | Required Storage Per Character |
---|---|---|
utf8mb3 , utf8 (deprecated) |
仅 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 不使用 BOM 来存储 UTF-8 值。
使用 Unicode 与服务器通信的客户端应用程序应该相应地设置客户端字符集(例如,通过发出 SET NAMES 'utf8mb4'
语句)。有一些字符集不能用作客户端字符集。尝试使用它们与 SET NAMES
或 SET CHARACTER SET
将产生错误。请参阅 不可用的客户端字符集。
以下部分提供了 MySQL 中 Unicode 字符集的更多详细信息。