🙈 MySQL-05-字符集和校对规则
🙈 MySQL-05-字符集和校对规则
1 开篇介绍
👋 Hello 大家好,我是 Nagase ,MySQL 从删库到跑路 ,又到了学习 MySQL 的时刻,接下来就让我们感受一下 MySQL 独特的魅力吧。
在该篇博客中,我们主要介绍 字符集与校对规则 相关的内容,祝你学的开心 🥳 。
2 相关概念
2.1 字符
字符(Character) 是计算机中字母、数字、符号的统称,一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等。
计算机是以二进制的形式来存储数据的。平时我们在显示器上看到的数字、英文、标点符号、汉字等字符都是二进制数转换之后的结果。
2.2 字符集
字符集(Character set) 定义了 字符 和 二进制 的对应关系,为字符分配了唯一的编号。
常见的字符集: ASCII、GBK、ISO-8859-1 等。
2.3 字符编码
字符编码(Character encoding)也可以称为字集码,规定了如何将字符的编号存储到计算机中,是一种规则。
大部分 字符集 都只对应一种 字符编码 ,例如:ASCII、IOS-8859-1、GB2312、GBK,都是既表示了字符集又表示了对应的字符编码。所以 一般情况 下,可以将两者 视为同义词 。
However,Unicode 字符集除外,Unicode 有三种编码方案,即 UTF-8、UTF-16 和 UTF-32。
最为常用的是 UTF-8 编码。
2.4 字符集与字符编码的关系
字符集 与 字符编码 这两个概念常常会被混淆,但实际上,这两者是有区别的。
字符集 与 字符编码 是两个不同层面的概念:
- charset 是 character set 的简写,即:字符集。
- encoding 是 charset encoding 的简写,即:字符编码,简称编码。
从图中我们可以看出:
- 编码是依赖于字符集的,就类似于 Java 中的接口实现依赖于接口一样
- 一个字符集可以有多个编码,就类似于 Java 中的接口可以有多个实现类一样
2.5 校对规则
校对规则(Collation) 也可以称为排序规则,是指在同一个字符集内字符之间的比较规则。
字符集和校对规则是一对多的关系,每个字符集都有一个默认的校对规则。字符集和校对规则相辅相成,相互依赖关联。
3 查看 MySQL 当前字符集和校对规则
简单来说,字符集用来定义 MySQL 存储字符串的方式,校对规则用来定义 MySQL 比较字符串的方式。
有些数据库并 没有 清晰的 区分开 字符集和校对规则。例如,在 SQL Server 中创建数据库时,选择字符集就相当于选定了字符集和校对规则。
而在 MySQL 中,字符集和校对规则是 区分开 的,必须设置字符集和校对规则。一般情况下,没有特殊需求,只设置其一即可。只设置字符集时,MySQL 会将校对规则设置为字符集中对应的默认校对规则。
3.1 查看 MySQL 当前字符集
可以通过 SHOW VARIABLES LIKE 'character%';
命令查看当前 MySQL 使用的字符集,命令和运行结果如下所示:
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+------------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\mysql-5.6.51-winx64\share\charsets\ |
+--------------------------+------------------------------------------------------+
8 rows in set (0.00 sec)
上述运行结果含义如下表所示:
名称 | 说明 |
---|---|
character_set_client | MySQL 客户端使用的字符集 |
character_set_connection | 连接数据库时使用的字符集 |
character_set_database | 创建数据库使用的字符集 |
character_set_filesystem | MySQL 服务器文件系统使用的字符集,默认值为 binary,不做任何转换 |
character_set_results | 数据库给客户端返回数据时使用的字符集 |
character_set_server | MySQL 服务器使用的字符集,建议由系统自己管理,不要人为定义 |
character_set_system | 数据库系统使用的字符集,默认值为 utf8,不需要设置 |
character_sets_dir | 字符集的安装目录 |
3.2 查看 MySQL 当前的校对规则
可以通过 SHOW VARIABLES LIKE 'collation%';
命令查看当前 MySQL 使用的校对规则,命令和运行结果如下所示:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
上述运行结果含义如下表所示:
名称 | 说明 |
---|---|
collation_connection | 连接数据库时使用的校对规则 |
collation_database | 创建数据库时使用的校对规则 |
collation_server | MySQL 服务器使用的校对规则 |
其中,ci 表示大小写不敏感,cs 表示大小写敏感,bin 表示按照二进制编码值比较。
4 MySQL 字符集的转换过程
MySQL 中字符集的转换过程如下:
- 在终端执行 MySQL 命令或者 SQL 语句时,这些命令或语句从 终端字符集 转换为 character_set_client 定义的字符集。
- 使用终端成功连接 MySQL 服务器之后,就建立了一条 数据通信链路 ,MySQL 命令或者 SQL 语句沿着数据通信链路传向 MySQL 服务器,由 characer_set_client 定义的字符集转换为 character_set_connection 定义的字符集。
- MySQL 服务实例接收到数据通信链路中的 MySQL 命令或者 SQL 语句之后,将 MySQL 命令或者 SQL 语句从 character_set_connection 定义的字符集转换为 character_set_server 定义的字符集。
- 如果 MySQL 命令或者 SQL 语句针对于某个数据库进行操作,此时将 MySQL 命令或者 SQL 语句从 chatacter_set_server 定义的字符集转换为 character_set_database 定义的字符集。
- MySQL 命令或者 SQL 语句执行结束之后,将执行结果设置为 character_set_results 定义的字符集。
- 执行结果沿着数据通信链路返回,将执行结果从 character_set_results 定义的字符集转换为 character_set_client 定义的字符集,最终转换为终端字符集,显示到终端窗口中。