10.9 Unicode 支持

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

BMP 字符具有以下 Feature:

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

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

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

  • 它们足以应付主要语言中的几乎所有字符。

补充字符位于 BMP 之外:

  • 它们的代码点值在U+10000U+10FFFF之间)。

  • Unicode 对补充字符的支持要求字符集的范围超出 BMP 字符,因此比 BMP 字符占用更多的空间(每个字符最多 4 个字节)。

根据 RFC 3629 实现了用于对 Unicode 数据进行编码的 UTF-8(具有 8 位单位的 Unicode 转换格式)方法,该方法描述了从一到四个字节的编码序列。 UTF-8 的思想是使用不同长度的字节序列对各种 Unicode 字符进行编码:

  • 基本的拉丁字母,数字和标点符号使用一个字节。

  • 大多数欧洲和中东脚本字母均以 2 字节的 Sequences 排列:扩展的拉丁字母(带有波浪号,马克龙,尖刻,重音和其他重音符号),西里尔字母,希腊语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语等。

  • 韩文,中文和日文 table 意 Literals 使用 3 字节或 4 字节序列。

MySQL 支持以下 Unicode 字符集:

  • utf8mb4:Unicode 字符集的 UTF-8 编码,每个字符使用 1-4 个字节。

  • utf8mb3:Unicode 字符集的 UTF-8 编码,每个字符使用一到三个字节。

  • utf8utf8mb3的别名。

  • ucs2:Unicode 字符集的 UCS-2 编码,每个字符使用两个字节。

  • utf16:Unicode 字符集的 UTF-16 编码,每个字符使用两个或四个字节。类似于ucs2,但扩展了辅助字符。

  • utf16le:Unicode 字符集的 UTF-16LE 编码。像utf16,但是小端而不是大端。

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

table10.2“ Unicode 字符集常规 Feature”总结了 MySQL 支持的 Unicode 字符集的一般 Feature。

table10.2 Unicode 字符集的一般特性

Character SetSupported Characters每个字符所需的存储量
utf8mb3 , utf8BMP only1,2 或 3 个字节
ucs2BMP only2 bytes
utf8mb4BMP 和补充1,2、3 或 4 个字节
utf16BMP 和补充2 或 4 个字节
utf16leBMP 和补充2 或 4 个字节
utf32BMP 和补充4 bytes

BMP 之外的字符将作为 REPLACEMENT CHARACTER 进行比较,并在转换为仅支持 BMP 字符(utf8mb3ucs2)的 Unicode 字符集时转换为'?'

如果您使用支持补充字符的字符集,并且比仅 BMP 的utf8mb3ucs2字符集“宽”,则应用程序可能会出现不兼容的问题;参见第 10.9.8 节“在 3 字节和 4 字节 Unicode 字符集之间转换”。该部分还描述了如何将 table 从(3 字节)utf8mb3转换为(4 字节)utf8mb4,以及在执行此操作时可能遇到的限制。

大多数 Unicode 字符集都可以使用类似的排序规则集。例如,每个都有丹麦语排序规则,其名称为utf8mb4_danish_ciutf8mb3_danish_ciutf8_danish_ciucs2_danish_ciutf16_danish_ciutf32_danish_ciutf16leexception,它只有两个排序规则。有关 Unicode 归类及其区分属性(包括补充字符的归类属性)的信息,请参阅第 10.10.1 节“ Unicode 字符集”

UCS-2,UTF-16 和 UTF-32 的 MySQL 实现以大端字节 Sequences 存储字符,并且在值的开头不使用字节 Sequences 标记(BOM)。其他数据库系统可能使用低位字节序或 BOM。在这种情况下,在这些系统和 MySQL 之间传输数据时将需要执行值的转换。 UTF-16LE 的实现是小端的。

MySQL 对 UTF-8 值不使用 BOM。

使用 Unicode 与服务器通信的 Client 端应用程序应相应地设置 Client 端字符集(例如,通过发出SET NAMES 'utf8mb4'语句)。某些字符集不能用作 Client 端字符集。尝试将它们与SET NAMES设置字符集一起使用会产生错误。参见不允许的 Client 字符集

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