基于:Mysql 5.7 友链《字符集》

一、MySQL 支持的字符集

通过 SHOW CHARSET; 命令,能够查询 Mysql 支持的字符集,相关如下
image.png
字段描述

字段名称 描述
Charset 字符集
Description 描述
Default collation 字符集默认对应过的比较规则
Maxlen 表示要给字符占用的最大字节数

二、MySQL 支持的比较规则

通过 SHOW COLLATION [LIKE 匹配的模式]; 命令能够查询 MySQL 支持的比较规则,例如:
image.png
比较规则的命名按照一定规则进行命名,并以下划线“_”作为分隔,规则如下:

  • 名称以字符集的名称开头,如:utf8 字符集的比较规则以utf8 开头。
  • 字符集名称后跟着该比较器作用于那种语言,如:utf8_roman_ci 表示以罗马语的规则比较。
    但是也不全是某种语言,也可能涵盖一部分,甚至所有语言,如:utf8_general_ci 表示为通用的比较规则,适用于任何语言。
  • 最后的字符串表示,在比较的时候,是否区分重音、大小写等。例如:
    image.png

    三、MySQL客户端服务端通讯字符集问题

    客户端与服务端之间的交互是通过命令进行的,而所谓的命令在执行前都是一串字符串。
    MySQL 操作命令执行过程中,会伴随着多次的字符集转换,在转换过程中,如果存在编码解码采用的字符集不一致,会导致解码失败,命令无法正常执行。
    MySQL 客户端/服务端之间交互存在三次字符集的变更

  • 客户端操作系统编码 -> 服务端操作的字符集编码

  • 服务端操作的字符集编码 -> 具体的列编码
  • 执行命令后的结构集 -> 操作系统接收的编码

上述三个转换对应了 MySQL 三个变量的设置

  • character_set_client
    表示客户端发送命令时使用的编码,服务端根据该配置进行解码
  • character_set_connection
    表示将客户端传递过来的命令通过 character_set_connection 进行编码
  • character_set_result
    表示服务端执行完命令后,将结果集响应给客户端时使用的编码

这个流程图,如下
image.png

最佳方案

编码转换的错误会导致命令的错误执行,甚至无法解析。所以最佳方案就是将 character_set_clientcharacter_set_connectioncharacter_set_results 设置为相同的编码格式。
几种设置变量的方式

命令:SET NAMES 字符集名称;

案例如下:
image.png

命令: SET 变量名称 = 字符集名称

案例:
image.png

配置+启动时指定

在配置文件中增加配置

  1. [client]
  2. default-character-set=utf8

启动时选项指定该配置

四、MySQL的字符集和比较规则

MySQL 有四个级别的字符集和比较规则

  • 服务器级别
    服务器设置了两个变量来表示服务器级别的字符集和比较规则
    character_set_server :服务级别的字符集
    collation_server:服务器级别的比较规则
  • 数据库级别
    在创建数据库、修改数据库的时候指定字符集和比较规则
    image.png
  • 表级别
    在创建表、修改表的时候指定字符集和比较规则
    image.png
  • 列级别
    在创建列、修改列的时候指定字符集和比较规则
    image.png

数据存储使用那种编码格式取决于上述几种级别编码格式和比较规则的设置。
进行数据存储操作的简易步骤如下

  • 建库
  • 建表
  • 存数据

而数据存储采用那种编码存储的顺序

  • 列:如果列设置了编码
  • 表:如果表设置了编码
  • 数据库:如果数据库设置了编码
  • 服务器:如果创建数据库、表、列都未指定编码,则默认使用服务器默认指定的编码

比较规则同上。