MySQL的字符集与校对规则
# 什么是字符集与校对规则
字符集指的是⼀种从⼆进制编码到某类字符符号的映射。校对规则则是指某种字符集下的排序规则。MySQL中每⼀种字符集都会对应⼀系列的校对规则。
MySQL采⽤的是类似继承的⽅式指定字符集的默认值,每个数据库以及每张数据表都有⾃⼰的默认值,他们逐层继承。⽐如:某个库中所有表的默认字符集将是该数据库所指定的字符集(这些表在没有指定字符集的情况下,才会采⽤默认字符集)
# 字符集(Character set)
是多个字符(英文字符,汉字字符,或者其他国家语言字符)的集合,字符集种类较多,每个字符集包含的字符个数不同。
特点:
- 字符编码方式是用一个或多个字节表示字符集中的一个字符
- 每种字符集都有自己特有的编码方式,因此同一个字符,在不同字符集的编码方式下,会产生不同的二进制
常见字符集:
- ASCII字符集:基于罗马字母表的一套字符集,它采用1个字节的低7位表示字符,高位始终为0。
- LATIN1字符集:相对于ASCII字符集做了扩展,仍然使用一个字节表示字符,但启用了高位,扩展了字符集的表示范围。
- GBK字符集:支持中文,字符有一字节编码和两字节编码方式。
- UTF8字符集:Unicode字符集的一种,是计算机科学领域里的一项业界标准,支持了所有国家的文字字符,utf8采用1-4个字节表示字符。
# MySQL的字符集
查看字符编码支持
# 查看当前库
show variables like "charcter_set%";
# 查看所有支持的
show character set;
1
2
3
4
5
2
3
4
5
# 各种字符集的作用
# 字符编码转换原理
问:若character_set_client为UTF8,而character_set_database为GBK,则会出现需要进行编码转换的情况,字符集转换的原理是什么?
答:假设gbk字符集的字符串“你好”,需要转为utf8字符集存储,实际就是对于“你好”字符串中的每个汉字去utf8编码表里面查询对应的二进制,然后存储。
- MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
- 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,确定内部操作字符集步骤:
- 使用每个数据字段的CHARACTER SET设定值;
- 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值;
- 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;
- 若上述值不存在,则使用character_set_server设定值;
- 将操作结果从内部操作字符集转换为character_set_results。
# 正确使用字符集
- 对于insert来说,character_set_client、character_set_connection相同,而且正确反映客户端使用的字符集
- 对于select来说,character_set_results正确反映客户端字符集
- 数据库字符集取决于我们要存储的字符类型
- 字符集转换最多发生一次,这就要求character_set_client、character_set_connection相同
- 所有的字符集转换都发生在数据库端
# 修改MySQL的字符集
#设置所有字符集
set names 'utf8';
#修改数据库字符集
alter database database_name character set "utf8";
#只修改表的字符集,影响后续该表新增列的默认定义,已有列的字符集不受影响。
alter table table_name character set xxx;
#同时修改表字符集和已有列字符集,并将已有数据进行字符集编码转换。
alter table table_name convert to character set xxx;
#修改列字符集
alter table table_name modify col_name varchar(col_length) character set xxx;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 总结
- 建立数据库的时候注意字符集(gbk、utf8);
- 连接数据库以后,无论是执行dml还是select,只要涉及到varchar、char列,就需要设置正确的字符集参数。
# 校对规则collation校对
# 概念
校对规则是在字符集内用于字符比较和排序的一套规则,比如有的规则区分大小写,有的则无视。
校对规则特征:
- 两个不同的字符集不能有相同的校对规则;
- 每个字符集有一个默认校对规则;
- 存在校对规则命名约定:以其相关的字符集名开始,中间包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。
# 查看MySQL的校对规则
#查看支持的校对规则
show collation;
# 查看当前的库校对规则
show variables like 'collation_%';
1
2
3
4
2
3
4
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11