1. MySQL字符集概述

  • 针对数据的存储,MySQL提供了多种字符集。
  • 针对同一字符集内字符之间的比较,MySQL提供了与之对应的多种校对规则。
  • 一个字符集对应至少一种校对规则(通常是一对多的关系),两个不同的字符集不能有相同的校对规则,而且,每个字符集都设置默认的校对规则。
  • 可以通过如下命令查看MySQL支持的所有字符集:

    1. SHOW CHARACTER SET;

    或者使用系统表infromation_schema中的CHARACTER_SETS,如下:

    1. use information_schema;
    2. SELECT * FROM CHARACTER_SETS;
  • 在MS DOS窗口或者MySQL Shell窗口执行上述命令,可以得到如图所示的MySQL8.0字符集列表。

image.png

  • 通过如下命令可以查看MySQL支持的所有校对规则:

    1. SHOW COLLATION;
  • 或者使用系统表infromation_schema中的COLLATIONS,如下:

    1. USE information_schema;
    2. SELECT * FROM COLLATIONS;
  • 如果需要查看某一种特定的字符集,例如utf8字符集的校对规则,可以使用如下命令:

    1. SHOW COLLATION WHERE Charset = 'utf8';
  • 或者使用系统表infromation_schema中的COLLATIONS,如下:

    1. USE information_schema;
    2. SELECT * FROM COLLATIONS WHERE CHARACTER_SET_NAME = 'utf8';
  • 在MS DOS窗口或者MySQL Shell窗口执行上述命令,可以得到如图所示的utf8字符集的校对规则

  • 可以看出,utf8字符集的校对规则有28个,其中,“utf8_general_ci”是默认校对规则。
  • “utf8_general_ci”结尾的“ci”表示大小写不敏感;如果是“cs”,表示大小写敏感;如果是“bin”,表示按编码值比较。

image.png

2. MySQL字符集设置

  • MySQL对于字符集的设置分为4个级别:服务器(Server)、数据库(DataBase)、数据表(Table)和连接(Connection)
  • 可以查看MySQL字符集在各个级别上的默认设置,查看命令如下:

    1. SHOW VARIABLES LIKE 'character%';
  • 在MS DOS窗口或者MySQL Shell窗口执行上述命令,可以得到如图所示的各个级别的默认字符集

image.png

  • 可以单独查看某个特定级别的字符集默认设置,例如,查看服务器级的字符集默认设置的命令如下:

    1. SHOW VARIABLES LIKE 'character_set_server';
  • 可以查看MySQL校对规则在各个级别上的默认设置,查看命令如下:

    1. SHOW VARIABLES LIKE 'collation%';
  • 在MS DOS窗口或者MySQL Shell窗口执行上述命令,可以得到如图所示的各个级别的默认校对规则。

image.png

3. MySQL字符集常见问题

在数据库系统开发中,MySQL乱码一直是困扰开发者的主要问题。主要表现为:

  • 数据录入时为正常编码数据,但存入的数据库的数据后呈现乱码数据
  • 数据库中存储的是正常编码的数据,但读取后的数据呈现乱码形态

可以从数据流向的角度,分析出现上述乱码问题的主要原因:
数据输入端问题:在终端对用户录入的数据进行编码时,如果选择了与数据存储端不同的编码方式,则在传输后对数据进行解码过程时导致数据出现乱码。
网络问题:对于在线运行的数据库系统,可能因网络服务中断、网络服务质量不可靠等原因,出现数据接收不完整等现象,如果接收端不对数据的完整性进行校验,会导致数据库中存储了编码不完整的数据。
数据存储端问题:数据存储端主要是运行在服务器或者本地系统中的数据库,数据库存储的编码涉及多个层面,例如,若数据库管理系统采用Latin编码,而数据库层面未设置默认编码,则会继承使用数据库管理系统的编码,导致当存储中文数据时,会出现乱码。