本文更新于2019-06-16,使用MySQL 5.7,操作系统为Deepin 15.4。
常用字符集
字符集 |
定长 |
代码宽度 |
说明 |
ASCII或ISO-646 |
是 |
1字节7位 |
英文字母、数字、标点符号和33个控制符 |
ISO-8859系列 |
是 |
1字节8位 |
各西欧字符集,兼容ASCII |
GB2312 |
否 |
1或2字节 |
兼容ASCII,不推荐使用 |
GBK |
否 |
1或2字节 |
兼容GB2312 |
GB18030 |
否 |
1、2或4字节 |
兼容GBK |
Unicode或UCS-4或ISO-10646 |
是 |
4字节 |
从最高字节起依次代表组(group)、面(plane)、行(row)、格(ceil),包括BMP、辅助字面和专用字面 |
UCS-2 |
是 |
2字节 |
UCS-4的0组0面,即基本多语言文字面(BMP) |
Unicode有如下编码方式:
编码方式 |
定长 |
代码宽度 |
说明 |
UTF-8 |
否 |
1至6字节 |
兼容ASCII |
UTF-16 |
否 |
2或4字节 |
BMP使用2字节表示,以外使用4字节表示,按字节序不同分为UTF-16BE和UTF-16LE |
UTF-32 |
是 |
4字节 |
Unicode原始编码,按字节序不同分为UTF-32BE和UTF-32LE |
UTF-8编码如下:
字节 |
代码位数 |
代码空间 |
字节组合 |
1 |
0-7 |
0x0 - 0x7f |
0xxxxxxx |
2 |
8-11 |
0x80 - 0x7ff |
110xxxxx,10xxxxxx |
3 |
12-16 |
0x800 - 0xffff |
1110xxxx,10xxxxxx,10xxxxxx |
4 |
17-21 |
0x10000 - 0x1fffff |
11110xxx,10xxxxxx,10xxxxxx,10xxxxxx |
5 |
22-26 |
0x200000 - 0x3ffffff |
111110xx,10xxxxxx,10xxxxxx,10xxxxxx,10xxxxxx |
6 |
27-31 |
0x4000000 - 0x7fffffff |
1111110x,10xxxxxx,10xxxxxx,10xxxxxx,10xxxxxx,10xxxxxx |
每个汉字,GBK使用2字节,UTF-8使用3字节。
MySQL字符集
MySQL的UTF-8字符集最大长度为3字节,只能表示BMP中的字符(0-0xffff)。若要使用大于3字节的字符(如emoji),则需使用utf8mb4字符集。
MySQL包含字符集和校对规则两个概念。校对规则用来定义比较字符串的方式,一种字符集至少有一种校对规则,但可以有多种校对规则。校对规则的命名以其相关的字符集名开始,中间通常包含一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(比较是基于字符编码的值而与语言无关)结束,如gbk_chinese_ci。
MySQL的字符集和校对规则有4个级别的设置:
- 服务器级:可通过配置文件或启动选项设置,默认为latin1。
- 数据库级:可通过
CREATE DATABASE 或ALTER DATABASE 设置,如数据库中已存在记录,修改字符集不会将已有数据按照新的字符集进行存放。
- 表级:可通过
CREATE TABLE 或ALTER TABLE 设置,如表中已存在记录,修改字符集不会将已有数据按照新的字符集进行存放。
- 字段级:可通过
CREATE TABLE 或ALTER TABLE 设置,如表中已存在记录,修改字符集不会将已有数据按照新的字符集进行存放。
客户端和服务器交互时,还存在客户端、连接、返回结果的字符集和校对规则,通常这三者是相同的,才可以确保数据能被正确读取。可以通过SET NAMES charset 同时修改这三个值。可以通过[_charset] 'str' [COLLATE collation] 强制字符串的字符集和校对规则。
已有记录的字符集调整,需先将数据导出,经过适当调整后重新导入。
|