Unicode标准包括来自基本多语言平面(BMP)的字符和位于BMP之外的补充字符。本节介绍MySQL中对Unicode的支持。有关Unicode标准本身的信息,请访问Unicode Consortium网站。
BMP字符具有以下特征:
- 它们的代码点值在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字节的顺序排列:扩展的拉丁字母(带有波浪号,马克龙,尖刻,重音和其他重音),西里尔字母,希腊语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语等。
- 韩文,中文和日文表意文字使用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编码,每个字符使用四个字节。
注意该
utf8mb3
字符集已被弃用,并将在将来的MySQL版本中删除。请utf8mb4
改用。尽管utf8
目前是的别名utf8mb3
,但在某些时候utf8
会成为对utf8mb4
。为避免对的含义含糊不清utf8
,请考虑utf8mb4
为字符集引用而不是显式指定utf8
。
表10.2“ Unicode字符集的一般特性”总结了MySQL支持的Unicode字符集的一般特性。
表10.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字符(utf8mb3
或ucs2
)的Unicode字符集时转换为。
如果您使用支持增补字符,因此是字符集“宽”比BMP-只utf8mb3
和ucs2
字符集,也有你的应用程序潜在的不兼容问题;请参见“在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归类及其区分属性(包括补充字符的归类属性)的信息,请参见“ Unicode字符集”。
UCS-2,UTF-16和UTF-32的MySQL实现以大端字节顺序存储字符,并且在值的开头不使用字节顺序标记(BOM)。其他数据库系统可能使用低位字节序或BOM。在这种情况下,在这些系统和MySQL之间传输数据时将需要执行值的转换。UTF-16LE的实现是低端的。
MySQL对UTF-8值不使用BOM。
使用Unicode与服务器通信的客户端应用程序应相应地设置客户端字符集(例如,通过发出一条SET NAMES 'utf8mb4'
语句)。某些字符集不能用作客户端字符集。尝试将它们与一起使用SET NAMES
或SET CHARACTER SET
产生错误。请参阅不允许的客户字符集。
以下各节提供了有关MySQL中Unicode字符集的更多详细信息。