12.9 Unicode 支持
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( Unicode 转换格式,使用 8 位单元)用于编码 Unicode 数据,遵循 RFC 3629,该标准描述了以一个到四个字节的编码序列。UTF-8 的想法是,各种 Unicode 字符使用不同的字节序列进行编码:
-
基本拉丁字母、数字和标点符号使用一个字节。
-
大多数欧洲和中东脚本字母适合 2 个字节序列:带tilde、macron、acute、grave 和其他标点的扩展拉丁字母(包括希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语等)。
-
韩文、中文和日文字符使用 3 个或 4 个字节序列。
MySQL 支持这些 Unicode 字符集:
-
utf8mb4
: UTF-8 编码的 Unicode 字符集,使用一个到四个字节 per 字符。 -
utf8mb3
: UTF-8 编码的 Unicode 字符集,使用一个到三个字节 per 字符。这一字符集已经弃用,未来版本中将被删除;请使用utf8mb4
。 -
utf8
:已弃用的utf8mb3
别名;请使用utf8mb4
。Noteutf8
在 MySQL 未来版本中将变为utf8mb4
的别名。 -
ucs2
:Unicode 字符集的 UCS-2 编码,使用两个字节表示每个字符。已弃用;预计在将来版本中删除该字符集支持。 -
utf16
: Unicode 字符集的 UTF-16 编码,使用两个或四个字节表示每个字符。类似于ucs2
,但具有补充字符扩展功能。 -
utf16le
: Unicode 字符集的 UTF-16LE 编码,使用小端序而不是大端序。 -
utf32
: Unicode 字符集的 UTF-32 编码,使用四个字节表示每个字符。
字符集 utf8mb3
已弃用,建议使用 utf8mb4
。当前 utf8
是 utf8mb3
的别名,但现在已被弃用,预计将来会变为 utf8mb4
。MySQL 8.4 也在信息架构表的列和 SQL 命令输出中显示 utf8mb3
而不是 utf8
。
此外,您还应该注意,老版本 MySQL 的 collation 使用 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 对 UTF-8 值不使用 BOM。
使用Unicode通信的客户端应用程序应该设置相应的客户端字符集(例如,通过执行SET NAMES 'utf8mb4'
语句)。一些字符集不能用作客户端字符集。使用SET NAMES
或SET CHARACTER SET
语句时,会产生错误。详见不允许的客户端字符集.
以下部分提供了 MySQL 中 Unicode 字符集的详细信息。