mysql 细节记录02-字符集相关

客户端信息处理过程

  1. 客户端发出指令,字符集为character_set_client
  2. MySQL服务端接收到语句,把客户端发送的语句由character_set_client转换成character_set_connection(用户已经指定了字符集则使用用户指定的字符集),

    1. 语句中指定的字符串的比较或排序需要collation_connection中指定的校对规则处理
    2. 语句中指定的列的比较和collation_connection无关,因为表的列表对象有自己的校验规则,列的校对规则优先级更高
  3. 将语句执行完的结果按照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

存储字符集

粒度

  1. server,全局
  2. database,数据库
  3. table, 表
  4. column,列

作用域依次递减,优先级依次递增

设置字符集

1. 全局

使用全局配置的character_set_databasecollation_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;

字符集修改影响和注意点

  1. 当修改全局和库级别的字符集时,不会对已有的数据产生有影响,只会作用于新增数据
  2. 当修改表和列级的字符集时,MySQL会将已有的数据转换成新的字符集,这种情况就可能出现数据丢失的情况

相关命令

# 查看所有字符集
show character set;
# 查看字符集的校对规则
show collation like 'utf8%';
# 查看全局变量
show global variables like "character_set%";
# 查看会话级别系统变量
show variables like "character_set%";
show variables like "collation%";

标签: mysql

添加新评论