MySQL字符集与校对

一、什么是字符集与校对

1.字符集与校对

字符集是指一种从二进制编码到某种字符符号的映射。

校队是指一组用于某个字符集的配许规则。

2.utf8与utf8mb4

标准的UTF-8字符集编码是可以使用1-4个字节去编码21位字符,这几乎包含了世界上所有能看见的语言。
MySQL里面实现的utf8最长使用3个字符,包含了大多数字符但并不是所有。例如emoji和一些不常用的汉字,如“墅”,这些需要四个字节才能编码的就不支持。

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。建议选用utf8mb4的编码。

二、如何设置字符集与校队

数据库默认字符集设置:character_set_server

表的字符集设置:将根据数据库的字符集设置来指定这个表的字符集

列的字符集设置:将根据表的设置来指定列的字符集设置

注意:真正存放数据的是列,所以更高“阶梯”的设置只是制定默认值。一个表的默认字符集设置,无法影响存储在这个表中某个列的值。只有当创建列,而没为列有指定字符集的时候,表的默认字符集才会在列上生效。

1.查看、修改数据库字符集与校对

1)查看

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

2)修改

在配置文件中修改

character_set_server = utf8mb4

collation_server         = utf8mb4_unicode_ci

2.查看、修改指定数据库的字符集与校对

1)查看

SHOW CREATE DATABASE dbname;

2)修改

ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];  

3.查看、修改表的字符集与校对

1)查看

select * from information_schema.TABLES where TABLE_SCHEMA='ifpay_account';

select TABLE_SCHEMA,TABLE_NAME,TABLE_COMMENT,TABLE_COLLATION from information_schema.TABLES where TABLE_SCHEMA='ifpay_account';

SHOW CREATE TABLE tbl_name;

2)修改

修改表的字符集与校队

ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE...];

修改表与列的字符集与校对

ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...] ;

4.查看、修改列的字符集与校对

1)查看

SHOW FULL COLUMNS FROM tbl_name;

2)修改

ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE ...]; 

最后根据数据字典,查询相关信息

列:

查看列的详细信息

select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAME,COLUMN_TYPE,IS_NULLABLE from information_schema.columns
where TABLE_SCHEMA in ('ifpay_ccpay','ifpay_schedule') and COLLATION_NAME is not null;

查看列的COLLATION类型统计

select TABLE_SCHEMA,COLLATION_NAME,count(*) from information_schema.columns where TABLE_SCHEMA
 in('ifpay_ccpay','ifpay_schedule') and COLLATION_NAME is not null
group by TABLE_SCHEMA,COLLATION_NAME;

表:

select table_schema,table_name,engine,table_collation from information_schema.TABLES where TABLE_SCHEMA
 in ('ifpay_ccpay','ifpay_schedule') ;

数据库:

select * from mysql.db

三、关于MySQL中的7个 character_set 变量说明

1.character_set变量

1)character_set_client

       主要用来设置客户端使用的字符集。

2)character_set_connection
  主要用来设置连接数据库时的字符集,如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。

3)character_set_database
  主要用来设置默认创建数据库的编码格式,如果在创建数据库时没有设置编码格式,就按照这个格式设置。

4)character_set_filesystem
  文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的。

5)character_set_results
  数据库给客户端返回时使用的编码格式,如果没有指明,使用服务器默认的编码格式。

6)character_set_server
  服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,不要人为定义。

7)character_set_system
  数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是为存储系统元数据的编码格式。

2.MySQL各个字符集使用出处

在启动mysql后,我们只关注下列变量是否符合我们的要求
character_set_client
character_set_connection
character_set_database
character_set_results
character_set_server
下列两个系统变量我们不需要关心,不会影响乱码等问题
character_set_filesystem
character_set_system

mysql Server收到请求时将请求数据从 character_set_client 转换为 character_set_connection
进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,步骤如下
  A. 使用每个数据字段的 CHARACTER SET 设定值;
  B. 若上述值不存在,则使用对应数据表的字符集设定值
  C. 若上述值不存在,则使用对应数据库的字符集设定值;
  D. 若上述值不存在,则使用 character_set_server 设定值。
最后将操作结果从内部操作字符集转换为 character_set_results

参考:

https://blog.csdn.net/sun8112133/article/details/79921734

原文地址:https://www.cnblogs.com/xibuhaohao/p/9927992.html