字符集和比较规则
字符集的概念:
人们抽象出一个字符集的概念来描述某个字符范围的编码规则。
比较规则的概念:
对于某一种字符集来说,可以制定用来比较字符大小的多种规则,也就是说同一种字符集可以有多种规则。
最常用的 UTF-8 字符集在表示一个字符时需要使用1 ~ 4个字节,但是我们常用的一些字符使用1 ~ 3个字符就可以了。
在设计上,MySQL定义了下面两个概念
- utf8mb3:“阉割” 过的UTF-8字符集,只使用1~3个字节表示字符。
- utf8mb4:正宗的UTF-8字符集,使用1~4个字节表示字符。
在 MySQL8.0 中,MySQL 的默认字符集是 utf8mb4 。
一个字符集可以有多种比较规则
可以用show charset;
命令查看。
其中:
- ai:不区分重音
- as:区分重音
- ci:不区分大小写
- cs:区分大小写
- bin:以二进制方式比较
character_set_server
: 当前服务器的字符集
collation_server
: 当前服务器的比较规则
可以用 show varlables like ‘上述的两个’ 来查看。
character_set_database
: 当前数据库的字符集
collation_database
: 当前了数据库的比较规则
查看方式和上述所说的一样。
字符集和比较规则分几个级别:
- 服务器级别
- 数据库级别
- 表级别
- 列级别
每个级别的字符集都是可以进行调整,有相关的命令。
继承关系:
在创建数据库的时候如果不显式指定字符集和比较规则,这时候将使用服务器级别的比较规则。
在创建表的时候如果不显式指定字符集和比较规则,这时候将使用数据库级别的比较规则。
在创建列的时候如果不显式指定字符集和比较规则,这时候将使用表级别的比较规则。
最后,如果客户端和服务端的所用的字符集不一致可能会导致乱码;如果在排序的时候所得到的结果与预期不一致,可能是比较规则没设置好。