MySQL字符集与排序规则详解
MySQL字符集与排序规则详解
1. 字符集
1.1 一些重要的字符集
ASCII:共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码。
ISO-8859-1:共收录 256 个字符,是在 ASCII 字符集的基础上又扩充了 128个 西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名latin1。
GB2312:收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同时这种字符集又兼容 ASCII 字符集,所以有以下规则:
如果该字符在 ASCII 字符集中,则采用 1 字节编码。
否则采用 2 字节编码。
GBK:GBK 字符集只是在收录字符范围上对GB2312 字符集作了扩充,编码方式上兼容GB2312 。
UTF8:收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容 ASCII 字符集,采用变长编码方式,编码一个字符需要使用1~4个字节。UTF8 只是 Unicode 字符集的一种编码方案,Unicode字符集可以采用UTF8、UTF16、UTF32 这几种编码方案,UTF8 使用1~4个字节编码一个字符,UTF16 使用 2 个或 4 个字节编码一个字符,UTF32使用 4 个字节编码一个字符。
1.2 MySQL 中的 utf8 和 utf8mb4
- utf8(utf8mb3):阉割过的 utf8 字符集,使用1~3个字节表示字符。
- utf8mb4:正宗的 utf8 字符集,使用1~4个字节表示字符。
1.3 查看字符集
查看MySQL支持的字符集:
SHOW (CHARACTER SET | CHARSET) [LIKE 匹配的模式]
返回结果中,Maxlen
列表示该种字符集表示一个字符最多需要几个字节。以下几个字符集的 Maxlen
需要重点关注:
- ascii:1
- latin1:1
- gb2312:2
- gbk:2
- utf8:3
- utf8mb4:4
2. 比较规则
一种字符集可能对应着若干种比较规则,不同的比较规则对于相同字符产生的结果可能不同。例如,在字符集为 latin1 的情况下:
- 比较规则为
latin1_general_ci
时,A 和 a 是相等的。 - 比较规则为
latin1_general_cs
时,A 和 a 是不相等的。
2.1 查看比较规则
查看MySQL支持的比较规则:
SHOW COLLATION [LIKE 匹配的模式]
例如,查看utf8相关的比较规则:
SHOW COLLATION LIKE 'utf8_%';
比较规则的命名规则:
- 以字符集名称开头,如
utf8_
- 后面跟着语言标识,如
polish
、spanish
- 结尾表示是否区分大小写、重音等,如
_ci
(不区分大小写)、_cs
(区分大小写)
3. 字符集和比较规则的级别
字符集和比较规则可以设置在不同级别:
- 服务器级别:通过配置文件设置
- 数据库级别:在创建或修改数据库时设置
- 表级别:在创建或修改表时设置
- 列级别:在创建或修改列时设置
3.1 服务器级别
服务器级别的字符集和比较规则可以通过配置文件修改,例如在/etc/mysql/my.cnf
中:
[server]
character_set_server=latin1
collation_server=latin1_general_cs
3.2 数据库级别
创建或修改数据库时可以指定字符集和比较规则:
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
3.3 表级别
创建或修改表时可以指定字符集和比较规则:
CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]]
ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]
3.4 列级别
创建或修改列时可以指定字符集和比较规则:
CREATE TABLE 表名( 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称], 其他列… );
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
4. 仅修改字符集或仅修改比较规则
- 只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。
- 只修改比较规则,则字符集将变为修改后的比较规则对应的字符集。
5. MySQL中字符集的转换
5.1 相关变量
character_set_client
:服务器解码请求时使用的字符集character_set_connection
:服务器处理请求时会把请求字符串从character_set_client
转为character_set_connection
character_set_results
:服务器向客户端返回数据时使用的字符集
5.2 转换过程
5.3 修改相关变量的值
可以使用以下语句修改字符集:
SET NAMES 字符集名;
等价于:
SET character_set_client = 字符集名;
SET character_set_connection = 字符集名;
SET character_set_results = 字符集名;