

点击上方
蓝色
文字 关注我们吧!
曾几何时,我们这些做O DBA的,对MySQL是很不屑的,为什么这么说呢,除了那“薄薄的”1000多页的官方文档,还有就是很不完善的功能和架构。也正因为它不完善和广泛的互联网公司采用(免费最重要),所以MySQL的待遇水平也是水涨船高。
我们今天就来重点认识一下MySQL字符集,看看他在这方面有哪些有点!
1. MySQL字符集
2. MySQL比较规则
字符集本身是比较简单的,难在设置上,尤其是MySQL,一个字“乱”。先看一张图:

这是MySQL 5.7版本的数据库所支持的字符集,共41个,经验证MySQL 8.0以上版本也是这么多,没有发生变化。
这里需要说明两点:
1)UTF8字符集
在MySQL官方文档中,有这样一段描述,

可以知道utf8其实是utf8mb3的别名,别名的意思可就灵活了,现在是utf8mb3,将来就有可能是utf8mb4,因此我们在使用utf8作为字符集时,一律设置为utf8mb4,避免以后的尴尬。
2)GB18030字符集
MySQL中是支持gb18030,那它是符合那个标准来的呢,GB18030-2000,还是GB18030-2005?
在翻阅了MySQL的官方文档后,里面明确说明是采用的GB18030-2005。这一点比Oracle友好多了!

我们来看看MySQL默认字符集的设置:

查出来7个字符集相关的设置,看着蒙圈不?
我们先归归类:
一、将character_set_client,character_set_results,character_set_connection归为一组;
这三个系统变量设置,可以称作“客户端程序连接字符集”。
character_set_client
不是字面意义上的客户端字符集,是MySQL数据库认为客户端是什么字符集,如果客户端字符集和这个系统变量不一致,可能会出现乱码等意外现象;
character_set_connection
主要用来设置连接数据库时的字符集,如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。
character_set_results
数据库给客户端返回时使用的编码格式,如果没有指明,使用服务器默认的编码格式。
在网上找了一篇关于用户请求字符集转换流程,来更好的理解一下。
1)mysql Server收到请求时将请求数据从 character_set_client 转换为 character_set_connection
2)进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,步骤如下
A. 使用每个数据字段的 CHARACTER SET 设定值;
B. 若上述值不存在,则使用对应数据表的字符集设定值
C. 若上述值不存在,则使用对应数据库的字符集设定值;
D. 若上述值不存在,则使用 character_set_server 设定值。
3)最后将操作结果从内部操作字符集转换为 character_set_results

这三个系统变量转来转去的,弄的也有点晕了,所以,我们在设置时,将这三个系统变量设置一致。可以使用SET NAME “字符集名”(只对本次有效,重启失效),如果想永久有效,修改my.cnf,增加default-character-set = "字符集"(重启生效)
二、将character_set_server,character_set_database归为一组;
character_set_server
服务器字符集,可通过my.cnf或者SET 进行修改,服务器级别的字符集优先级最低,当列、表、数据库三个级别的字符集都没设置时,才有效。
character_set_database
数据库字符集,生效对象是针对一套库,一套MySQL软件可有多套库,而character_set_server 就是作用在软件层面,当character_set_database没有设置时,数据库使用character_set_server字符集。
三、
character_set_system;
系统字符集,MySQL官方文档称他是用作元数据使用的字符集,这里的元数据指,表名,字段名,数据库名等。默认使用UTF8,一般也只使用这个字符集,不需要更改。
四、
character_set_filesystem;
与文件有关,比如MySQL通过文件载入数据时,这个参数对文件内容字符集生效。
比较规则我们在开篇第一张图中就看到了每种字符集对应一种默认的比较规则,当我们在设定或选择使用的字符集时,没有指定比较规则的情况下,就会使用默认的比较规则。
按照对应关系来说,一个字符集可以对应多个比较规则。

我们以utf8为例,字符集的比较规则多达27种,默认比较规则为utf8_general_ci
规则里的名称后缀有ci, bin都是什么意思呢?我们归纳一下

后缀同样适用oracle哦!!!

写完这篇MySQL,对于重新认识字符集系列将告一段落。如果后期再做其他类型数据库时,依然会再补充进来。
简单对这次重新总结字符集的一个感悟,确实体会到了“温故而知新”。更有益的是,系统化的去了解,让碎片知识可以系统化。我们这个时代的人,被各种碎片化,无论怎样都感受不到充实,是需要那么一根绳子,能够将它们穿连起来。




