文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.9 Unicode 支持

Unicode 标准包含来自基本多语言平面 (BMP) 的字符和位于 BMP 之外的补充字符。本节介绍 MySQL 中对 Unicode 的支持。有关 Unicode 标准本身的信息,请访问Unicode 联盟网站.

BMP 字符具有以下特点

  • 它们的代码点值介于 0 到 65535(或U+0000U+FFFF)之间。

  • 它们可以使用可变长度编码进行编码,使用 8、16 或 24 位(1 到 3 字节)。

  • 它们可以使用固定长度编码进行编码,使用 16 位(2 字节)。

  • 它们足以满足大多数主要语言中的几乎所有字符。

补充字符位于 BMP 之外

  • 它们的代码点值介于U+10000U+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:Unicode 字符集的 UTF-8 编码,每个字符使用 1 到 4 个字节。

  • utf8mb3:Unicode 字符集的 UTF-8 编码,每个字符使用 1 到 3 个字节。此字符集已弃用,将在未来的版本中删除;请改用utf8mb4

  • utf8utf8mb3 的弃用别名;请改用utf8mb4

    注意

    在未来的 MySQL 版本中,预计utf8 将成为utf8mb4 的别名。

  • ucs2:Unicode 字符集的 UCS-2 编码,每个字符使用 2 个字节。已弃用;预计在未来的版本中将删除对该字符集的支持。

  • utf16:Unicode 字符集的 UTF-16 编码,每个字符使用 2 个或 4 个字节。类似于ucs2,但扩展了对补充字符的支持。

  • utf16le:Unicode 字符集的 UTF-16LE 编码。类似于utf16,但使用小端序而不是大端序。

  • utf32:Unicode 字符集的 UTF-32 编码,每个字符使用 4 个字节。

注意

utf8mb3 字符集已弃用,预计将在未来的 MySQL 版本中删除。请改用utf8mb4utf8 当前是utf8mb3 的别名,但现在已作为别名弃用,预计随后utf8 将成为对utf8mb4 的引用。MySQL 9.0 还将在 Information Schema 表的列以及 SQLSHOW 语句的输出中显示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 字符集(utf8mb3ucs2)时)。

如果您使用支持补充字符的字符集,因此比仅支持 BMP 的utf8mb3ucs2 字符集“更宽”,则您的应用程序可能会出现潜在的兼容性问题;请参阅第 12.9.8 节, “在 3 字节和 4 字节 Unicode 字符集之间转换”。该部分还介绍了如何将表从(3 字节)utf8mb3 转换为(4 字节)utf8mb4,以及这样做时可能适用的约束。

大多数 Unicode 字符集都提供了一组类似的排序规则。例如,每个字符集都具有丹麦语排序规则,其名称分别为utf8mb4_danish_ciutf8mb3_danish_ci(已弃用)、utf8_danish_ci(已弃用)、ucs2_danish_ciutf16_danish_ciutf32_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 NAMESSET CHARACTER SET 会产生错误。请参阅 不允许的客户端字符集

以下部分提供了有关 MySQL 中 Unicode 字符集的更多详细信息。