3.1 字符集和比较规则简介
3.1.1 字符集简介
字符集:人们抽象出来的用来描述某个字符范围的编码规则。
3.1.2 比较规则简介
如何比较两个字符,最简单的方法是直接比较两个字符对应的二进制编码大小。但很多情况下并不适用。
3.1.3 一些重要的字符集
字符集 | 描述 | 大小(byte) |
---|---|---|
ASCII | 128个字符 | 1 |
ISO8859-1 | 扩充ASCII,256个字符 | 1 |
GB2312 | 兼容ASCII | 1~2 |
GBK | 兼容GB2312 | 1~2 |
UTF-8 | 几乎所有字节,兼容ASCII | 1~4 |
3.2 MySQL中支持的字符集和比较规则
3.2.1 MySQL中的utf8和utf8mb4
utf8mb3:“阉割”过的UTF-8字符集,只使用1~3字节表示字符。
utf8mb4:正宗的UTF-8字符集,使用1~4字节表示字符。MySQL8.0默认字符集。
3.2.2 字符集的查看
SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];
SHOW CHARSET;
Default collation:比较规则
3.2.3 比较规则的查看
SHOW COLLATION [LIKE 匹配的模式];
SHOW COLLATION LIKE 'utf8%'
比较规则名称后缀英文释义及描述
3.3 字符集和比较规则的应用
3.3.1 各级别的字符集和比较规则
1. 服务器级别
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';
2. 数据库级别
SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';
3. 表级别
建表时指定,可通过DDL修改。默认为该表所在数据库的字符集和比较规则。
4. 列级别
建表时指定,可通过DDL修改。默认为该列所在表的字符集和比较规则。
3.3.2 客户端和服务器通信过程中使用的字符集
1. 编码和解码使用的字符集不一致
public static void main(String[] args) {
String s = "我";
// 转GBK打印
System.out.println(new String(s.getBytes(StandardCharsets.UTF_8), Charset.forName(GBK))); // 鎴�
}
对于同一个字符串,如果编码和解码使用的字符集不一样,会产生意想不到的结果,在我们看来就像是产生了乱码一样。
2. 字符集转换的概念
0xE68891这个字节序列按归UTF-8字符集进行解码,然后又把它按照GBK字符集进行编码,编码后0xCED2。这个过程称为字符集的转换。
3. MySQL 中的字符集转换过程
- 客户端发送请求
- 服务器接收请求
- 服务器处理请求
- 服务器生成响应
- 客户端接收响应
3.3.3 比较规则的应用
比较规则通常用来比较字符串的大小以及对某些字符串进行排序,所以也称为排序规则。
3.4 总结
- 字符集指的是某个字符范围的编码规则
- 比较规则是对某个字符集的字符比较大小的一种规则
- 在 MySQL 中,一个字符集可以有多个比较规则