Unicode标准包括来自基本多语言平面(BMP)的字符和位于BMP之外的补充字符。本节描述MySQL对Unicode的支持。有关Unicode标准本身的信息,请访问Unicode协会网站.
BMP字符具有以下特征:
它们的码点值在0到65535之间(或
U + 0000
而且U +飞行符
).它们可以使用8、16或24位(1到3字节)的可变长度编码进行编码。
它们可以使用16位(2字节)的固定长度编码进行编码。
它们足以处理主要语言中的几乎所有字符。
补充字符位于BMP之外:
它们的代码点值介于
U + 10000
而且U + 10飞行符
).Unicode对补充字符的支持要求字符集具有BMP字符以外的范围,因此比BMP字符占用更多的空间(每个字符最多4个字节)。
编码Unicode数据的UTF-8(含8位单位的Unicode转换格式)方法是根据RFC 3629实现的,该方法描述了从1到4个字节的编码序列。UTF-8的思想是使用不同长度的字节序列编码各种Unicode字符:
基本的拉丁字母、数字和标点符号使用一个字节。
大多数欧洲和中东的文字字母都属于2字节序列:扩展的拉丁字母(带有波浪号、马克隆号、锐号、庄重和其他口音)、西里尔字母、希腊字母、亚美尼亚字母、希伯来字母、阿拉伯字母、叙利亚字母和其他字母。
韩国、中国和日本的表意文字使用3字节或4字节序列。
MySQL支持以下Unicode字符集:
utf8mb4
: Unicode字符集的UTF-8编码,每个字符使用1到4个字节。utf8mb3
: Unicode字符集的UTF-8编码,每个字符使用1到3个字节。use utf8
:的别名。utf8mb3
.ucs2
: Unicode字符集的UCS-2编码,每个字符使用两个字节。utf16
:每个字符使用两个或四个字节的Unicode字符集的UTF-16编码。就像ucs2
但是有一个用于补充字符的扩展。utf16le
: Unicode字符集的UTF-16LE编码。就像utf16
但是小端排序而不是大端排序。utf32
:每个字符使用四个字节的Unicode字符集的UTF-32编码。
的utf8mb3
字符集已弃用,您应该期望在未来的MySQL版本中删除它。请使用utf8mb4
代替。虽然use utf8
是当前的别名utf8mb3
,在某种程度上use utf8
期望成为参考utf8mb4
.的意思避免含糊不清use utf8
,可以考虑指定utf8mb4
显式地用于字符集引用而不是use utf8
.
表10.2“Unicode字符集一般特征”,总结了MySQL支持的Unicode字符集的一般特征。
表10.2 Unicode字符集一般特征
字符集 | 支持字符 | 每个字符所需的存储空间 |
---|---|---|
utf8mb3 ,use 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之外的字符比较为替换字符并转换为“?”
转换为只支持BMP字符的Unicode字符集(utf8mb3
或ucs2
).
如果您使用支持补充字符的字符集,那么”更广泛的”比BMP-onlyutf8mb3
而且ucs2
字符集,你的应用程序有潜在的不兼容问题;看到第10.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排序规则及其区分属性的信息,包括补充字符的排序规则属性,请参见第10.10.1节“Unicode字符集”.
UCS-2、UTF-16和UTF-32的MySQL实现以大端字节顺序存储字符,并且在值的开头不使用字节顺序标记(BOM)。其他数据库系统可能使用小端字节顺序或BOM。在这种情况下,在这些系统和MySQL之间传输数据时需要执行值的转换。UTF-16LE的实现是小端式的。
MySQL对UTF-8值不使用BOM。
使用Unicode与服务器通信的客户机应用程序应该相应地设置客户机字符集(例如,通过发出设置名称“utf8mb4”
声明)。某些字符集不能用作客户端字符集。试图用它们组名称
或设置字符集
产生一个错误。看到不允许的客户端字符集.
下面的部分提供了MySQL中Unicode字符集的更多细节。