mysql 细节记录02-字符集相关
客户端信息处理过程
- 客户端发出指令,字符集为
character_set_client
MySQL服务端接收到语句,把客户端发送的语句由
character_set_client
转换成character_set_connection
(用户已经指定了字符集则使用用户指定的字符集),- 语句中指定的字符串的比较或排序需要
collation_connection
中指定的校对规则处理 - 语句中指定的列的比较和
collation_connection
无关,因为表的列表对象有自己的校验规则,列的校对规则优先级更高
- 语句中指定的字符串的比较或排序需要
- 将语句执行完的结果按照
character_set_results
系统变量设定的字符集返回结果给客户端
设置字符集
有上面的处理过程可以知道,执行一次请求时,会用到好几个字符集的设置,如果需要修改客户端连接的字符集时需要修改好几个,MySQL提供了命令用户快捷设置连接相关的字符集
1. set names
这个命令的功能是指定客户端的当前会话使用的字符集
set names cahrset_name [COLLATE 'collation_name']
例子
set names utf8;
# 相当于执行了下面的命令
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = utf8;
2. set character set
set character set cahrset_name
例子
set character set utf8;
# 相当于执行了下面的命令
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = @@character_set_database;
set collation_connection = @@collation_database;
3. 配置文件中指定字符集
上面两种方式修改的只是针对会话有效,可以直接在配置文件中指定字符集
[mysql]
default-character-set=utf8
存储字符集
粒度
- server,全局
- database,数据库
- table, 表
- column,列
作用域依次递减,优先级依次递增
设置字符集
1. 全局
使用全局配置的character_set_database
和collation_database
2. 数据库
# 创建时指定
create database a charset utf8;
# 修改
alter database a charset utf8;
也可以在数据库的存放目录下的db.opt文件中修改
3. 表
create table a.test (`id` int) charset utf8;
4. 列
create table a.test (`id` int,name char(10) charset gbk) charset utf8;
字符集修改影响和注意点
- 当修改全局和库级别的字符集时,不会对已有的数据产生有影响,只会作用于新增数据
- 当修改表和列级的字符集时,MySQL会将已有的数据转换成新的字符集,这种情况就可能出现数据丢失的情况
相关命令
# 查看所有字符集
show character set;
# 查看字符集的校对规则
show collation like 'utf8%';
# 查看全局变量
show global variables like "character_set%";
# 查看会话级别系统变量
show variables like "character_set%";
show variables like "collation%";