1. MySQL字符集概述
- 针对数据的存储,MySQL提供了多种字符集。
- 针对同一字符集内字符之间的比较,MySQL提供了与之对应的多种校对规则。
- 一个字符集对应至少一种校对规则(通常是一对多的关系),两个不同的字符集不能有相同的校对规则,而且,每个字符集都设置默认的校对规则。
可以通过如下命令查看MySQL支持的所有字符集:
SHOW CHARACTER SET;
或者使用系统表infromation_schema中的CHARACTER_SETS,如下:
use information_schema;
SELECT * FROM CHARACTER_SETS;
在MS DOS窗口或者MySQL Shell窗口执行上述命令,可以得到如图所示的MySQL8.0字符集列表。
通过如下命令可以查看MySQL支持的所有校对规则:
SHOW COLLATION;
或者使用系统表infromation_schema中的COLLATIONS,如下:
USE information_schema;
SELECT * FROM COLLATIONS;
如果需要查看某一种特定的字符集,例如utf8字符集的校对规则,可以使用如下命令:
SHOW COLLATION WHERE Charset = 'utf8';
或者使用系统表infromation_schema中的COLLATIONS,如下:
USE information_schema;
SELECT * FROM COLLATIONS WHERE CHARACTER_SET_NAME = 'utf8';
在MS DOS窗口或者MySQL Shell窗口执行上述命令,可以得到如图所示的utf8字符集的校对规则
- 可以看出,utf8字符集的校对规则有28个,其中,“utf8_general_ci”是默认校对规则。
- “utf8_general_ci”结尾的“ci”表示大小写不敏感;如果是“cs”,表示大小写敏感;如果是“bin”,表示按编码值比较。
2. MySQL字符集设置
- MySQL对于字符集的设置分为4个级别:服务器(Server)、数据库(DataBase)、数据表(Table)和连接(Connection)
可以查看MySQL字符集在各个级别上的默认设置,查看命令如下:
SHOW VARIABLES LIKE 'character%';
在MS DOS窗口或者MySQL Shell窗口执行上述命令,可以得到如图所示的各个级别的默认字符集
可以单独查看某个特定级别的字符集默认设置,例如,查看服务器级的字符集默认设置的命令如下:
SHOW VARIABLES LIKE 'character_set_server';
可以查看MySQL校对规则在各个级别上的默认设置,查看命令如下:
SHOW VARIABLES LIKE 'collation%';
在MS DOS窗口或者MySQL Shell窗口执行上述命令,可以得到如图所示的各个级别的默认校对规则。
3. MySQL字符集常见问题
在数据库系统开发中,MySQL乱码一直是困扰开发者的主要问题。主要表现为:
- 数据录入时为正常编码数据,但存入的数据库的数据后呈现乱码数据
- 数据库中存储的是正常编码的数据,但读取后的数据呈现乱码形态
可以从数据流向的角度,分析出现上述乱码问题的主要原因:
数据输入端问题:在终端对用户录入的数据进行编码时,如果选择了与数据存储端不同的编码方式,则在传输后对数据进行解码过程时导致数据出现乱码。
网络问题:对于在线运行的数据库系统,可能因网络服务中断、网络服务质量不可靠等原因,出现数据接收不完整等现象,如果接收端不对数据的完整性进行校验,会导致数据库中存储了编码不完整的数据。
数据存储端问题:数据存储端主要是运行在服务器或者本地系统中的数据库,数据库存储的编码涉及多个层面,例如,若数据库管理系统采用Latin编码,而数据库层面未设置默认编码,则会继承使用数据库管理系统的编码,导致当存储中文数据时,会出现乱码。