服务端的字符集和比较规则
MySQL的字符集分为服务器级别、数据库级别、表级别和列级别。
服务器级别
系统变量 | 描述 | 类型 | 默认值 |
---|---|---|---|
character_set_server | 服务器级别的字符集 | 动态变量 | utf8 |
collation_server | 服务器级别的比较规则 | 动态变量 | utf8_general_ci |
数据库级别
创建和修改数据库可以指定数据库级别的字符集和比较规则
create database 数据库名
[[default] character set 字符集名称]
[[default] collation 比较规则名称];
alter database 数据库名
[[default] character set 字符集名称]
[[default] collation 比较规则名称];
系统变量 | 描述 |
---|---|
character_set_database | 当前数据库的字符集 |
collation_database | 当前数据库的比较规则 |
> use db0;
> show variables like 'character_set_database';
> show variables like 'collation_database';
表级别
创建和修改表的时候可以指定表的字符集和比较规则
create table 表名(列信息)
[[default] character set 字符集名称]
[[default] collation 比较规则名称];
alter table 表名
[[default] character set 字符集名称]
[[default] collation 比较规则名称];
列级别
对于存储字符串的列,同一个表的不同列也可以有不同的字符集和比较规则;创建和修改列的时候可以指定列的字符集和比较规则
create table 表名(
列名 字符串类型 [character set 字符集名称] [collation 比较规则],
其他列...
);
alter table 表名 modify 列名 字符串类型 [character set 字符集名称] [collation 比较规则];
字符集和比较规则的关联
字符集和比较规则之间相互关联
修改操作 | 自动关联逻辑 |
---|---|
只修改字符集 | 比较规则将修改为修改后字符集默认的比较规则 |
只修改比较规则 | 字符集将修改为修改后的比较规则对应的字符集 |
查看数据库支持的字符集和比较规则
show character set;
show collation;
各级别的字符集和比较规则优先级
列 → 表 → 库 → 服务器
没有显式指定字符集和比较规则则按照该优先级逐层确认字符集和比较规则
客户端链接使用的字符集
三个session级别的系统变量及其作用
系统变量 | 描述 |
---|---|
character_set_client | 服务器认为请求是按照系统变量指定的字符集进行编码 |
character_set_connection | 服务器在处理请求时,会把请求字节序列从character_set_client转换为character_set_connection |
character_set_results | 服务器采用该系统变量指定的字符集对返回给客户端的字符串进行编码 |
一些关键流程
- 客户端发送的请求字节序列采用character_set_client系统变量对应的字符集进行编码
- 服务器收到请求字节序列才采用character_set_connection系统变量对应的字符集进行编码
- 服务器在运行过程中会吧请求字节序列转换为服务器对应的级别的字符集
- 服务器在向客户端返回字节序列时,使用character_set_results系统变量对应的字符集进行编码
- 客户端在收到响应字节序列后采用character_set_client系统变量对应的字符集进行编码