10.9 Unicode 支持
Unicode 标准包括来自基本多语言平面(BMP)的字符和位于 BMP 之外的补充字符。本节介绍 MySQL 中对 Unicode 的支持。有关 Unicode 标准本身的信息,请访问Unicodeunion 网站。
BMP 字符具有以下 Feature:
-
它们的代码点值在 0 到 65535 之间(或
U+0000
和U+FFFF
)。 -
它们可以使用 8 位,16 位或 24 位(1 到 3 个字节)以可变长度编码进行编码。
-
它们可以使用 16 位(2 字节)以固定长度编码进行编码。
-
它们足以应付主要语言中的几乎所有字符。
补充字符位于 BMP 之外:
-
它们的代码点值在
U+10000
和U+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 编码,每个字符使用一到三个字节。 -
utf8
:utf8mb3
的别名。 -
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 Set | Supported Characters | 每个字符所需的存储量 |
---|---|---|
utf8mb3 , utf8 | BMP only | 1,2 或 3 个字节 |
ucs2 | BMP only | 2 bytes |
utf8mb4 | BMP 和补充 | 1,2、3 或 4 个字节 |
utf16 | BMP 和补充 | 2 或 4 个字节 |
utf16le | BMP 和补充 | 2 或 4 个字节 |
utf32 | BMP 和补充 | 4 bytes |
BMP 之外的字符将作为 REPLACEMENT CHARACTER 进行比较,并在转换为仅支持 BMP 字符(utf8mb3
或ucs2
)的 Unicode 字符集时转换为'?'
。
如果您使用支持补充字符的字符集,并且比仅 BMP 的utf8mb3
和ucs2
字符集“宽”,则应用程序可能会出现不兼容的问题;参见第 10.9.8 节“在 3 字节和 4 字节 Unicode 字符集之间转换”。该部分还描述了如何将 table 从(3 字节)utf8mb3
转换为(4 字节)utf8mb4
,以及在执行此操作时可能遇到的限制。
大多数 Unicode 字符集都可以使用类似的排序规则集。例如,每个都有丹麦语排序规则,其名称为utf8mb4_danish_ci
,utf8mb3_danish_ci
,utf8_danish_ci
,ucs2_danish_ci
,utf16_danish_ci
和utf32_danish_ci
。 utf16le
exception,它只有两个排序规则。有关 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 字符集的更多详细信息。