mysql字符集及内部编码转换

一、mysql字符集

查看数据库支持的字符集和校对规则

show character set;

charset   列标识支持的字符集

collation 列表示支持的校对规则

查询数据库的字符集和校对规则

show variables like '%character%';

show variables like '%collation%';

服务端设置默认字符集和校对规则:(校对规则与字符集默认匹配,每个字符集都有默认的校对规则)

1、编译数据库的时候指定字符集

2、mysql启动服务时通过设置字符参数 mysqld_safe --character_set_server=utf8mb4 &

3、在my.cnf 中指定数据库字符参数   character_set_server=utf8mb4  

4、在mysql运行服务期间修改  set global character_set_server=utf8mb4;

二、连接时字符集及转换

mysql>show variables like 'chara%';

+--------------------------+----------------------------------+

| Variable_name            | Value                            |

+--------------------------+----------------------------------+

| character_set_client     | utf8mb4                          |

| character_set_connection | utf8mb4                          |

| character_set_database   | utf8mb4                          |

| character_set_filesystem | binary                           |

| character_set_results    | utf8mb4                          |

| character_set_server     | utf8mb4                          |

| character_set_system     | utf8                             |

| character_sets_dir       | /usr/local/mysql/share/charsets/ |

+--------------------------+----------------------------------+

连接客户端字符集:character_set_client  

客户端发出sql语句,由character_set_client  变量指定

服务端接收到语句后,会转换成character_set_connection 变量设置的字符集

服务端执行完语句后,会按照character_set_results 变量设置的字符集返回结果

character_set_client   --------> character_set_connection ----------> character_set_results

mysql Server收到请求时将请求数据从 character_set_client 转换为 character_set_connection

进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,步骤如下  

 A. 使用每个数据字段的 CHARACTER SET 设定值;  

 B. 若上述值不存在,则使用对应数据表的字符集设定值  

 C. 若上述值不存在,则使用对应数据库的字符集设定值;  

 D. 若上述值不存在,则使用 character_set_server 设定值。

最后将操作结果从内部操作字符集转换为 character_set_results

三、保存时字符集及转换

保存数据通过4种不同的粒度,指定存储的字符集

server     全局

database 数据库级

table       表级

column    列级

优先级:列>表>数据库>全局

继承关系:列继承表,表继承数据库,数据库继承全局

create database dd  charset gbk;

create table t1(id int) charset utf8;

create table t2(id int ,name varchar(20) charset utf8mb4);

show create database dd;

show create table t1/t2;

客户端、服务器端

只有连接和存储两个层面字符保存一致,才显示正常

字符集和超集直接的关系

超集包括子集,但如果连接和插入的字符集不一致,插入的时候就乱码,后续使用存储一致的字符集查询也是乱码 。尽量保持一致。

猜你喜欢

转载自blog.csdn.net/zll4859291/article/details/129924753