首先回答题目,可以直接在MySQL黑框里面设置输入SET NAMES GBK;
文章目录
1. 字符集
1.1 字符集简介
- 将一个字符映射成一个二进制数据的过程叫做 编码 ,将一个二进制数据映射到一个字符的过程叫做 解码。
- 人们抽象出一个 字符集 的概念来描述某个字符范围的编码规则
- 不同字符集有不同的字符范围,也就是说不同字符集能表示的不一样多
1.2 常见字符集
-
ASCII 字符集
共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码,我们看一些字符的编码方式:
‘L’ -> 01001100(十六进制:0x4C,十进制:76)
‘M’ -> 01001101(十六进制:0x4D,十进制:77) -
ISO 8859-1 字符集
共收录256个字符,是在 ASCII 字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名 latin1 。 -
GB2312 字符集
收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同时这种字符集又兼容 ASCII 字符集,所以在编码方式上显得有些奇怪:- 如果该字符在 ASCII 字符集中,则采用1字节编码。
- 否则采用2字节编码。
这种表示一个字符需要的字节数可能不同的编码方式称为 变长编码方式 。比方说字符串 ‘爱u’ ,其中 ‘爱’ 需要用2个字节进行编码,编码后的十六进制表示为 0xCED2 , ‘u’ 需要用1个字节进行编码,编码后的十六进制表示为 0x75 ,所以拼合起来就是 0xCED275 。
我们怎么区分某个字节代表一个单独的字符还是代表某个字符的一部分呢?别忘了
ASCII
字符集只收录128个字符,使用0~127就可以表示全部字符,所以如果某个字节是在0~127之内的,就意味着一个字节代表一个单独的字符,否则就是两个字节代表一个单独的字符。 -
GBK 字符集
GBK 字符集只是在收录字符范围上对 GB2312 字符集作了扩充,编码方式上兼容 GB2312 -
utf8 字符集
收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容 ASCII 字符集,采用变长编码方式,编码一个字符需要使用1~4个字节,比方说这样:‘L’ -> 01001100(十六进制:0x4C)
‘啊’ -> 111001011001010110001010(十六进制:0xE5958A)
说明:汉字在utf8中占3个字节,而在gbk中占2个字节
1.3 字符集比较
- 通过二进制编码来进行比较,比如’a’是小于’b’的
- 忽略大小写进行比较,如’a’和’A’是相等的,通常情况下,可以将大小写不同的字符转化为大写或者小写,再进行二进制比较
2. MySQL中支持的字符集和排序规则
2.1 MySQL中的utf8和utf8mb4
常用的一些字符使用1~3个字节就可以表示
- utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
- utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。
在 MySQL 中 utf8 是 utf8mb3 的别名,所以之后在 MySQL 中提到 utf8 就意味着使用1~3个字节来表示一个字符.如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使用 utf8mb4 。
2.2 MySQL中支持哪些字符集
输入:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];
其中的 Default collation 列表示这种字符集中一种默认的比较规则 。最后一列 Maxlen ,它代表该种字符集表示一个字符最多需要几个字节。重要的几种字符集的Maxlen如下,
2.3 比较规则的查看
输入:SHOW COLLATION [LIKE 匹配的模式];
例子:
- Collation字段中,前缀都是以utf8,表示utf8的比较规则。
- Collation字段中间的,如general表示一种通用的比较规则, utf8_polish_ci 表示以波兰语的规则比较。
- 名称后缀意味着该比较规则是否区分语言中的重音、大小写。
- Default字段表示默认比较规则,从图上看出,utf8的默认比较规则是 utf8_general_ci
后缀 | 英文释义 | 描述 |
---|---|---|
_ai | accent insensitive | 不区分重音 |
_as | accent sensitive | 区分重音 |
_ci | case insensitive | 不区分大小写 |
_cs | case sensitive | 区分大小写 |
_bin | binary | 以二进制方式比较 |
3.3 不同级别的字符集和比较规则
MySQL 有4个级别的字符集和比较规则,分别是:
- 服务器级别
- 数据库级别
- 表级别
- 列级别
3.3.1 服务器级别
- 两个系统变量:
- 查看这两个系统变量:
3.3.2 数据库级别
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
两个系统变量:
- character_set_database 和 collation_database 这两个系统变量是只读的,我们不能通过修改这两个变量的值
而改变当前数据库的字符集和比较规则。
3.3.3 表级别
CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]]
ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]
- 如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则。
3.3.4 列级别
- 对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则。
CREATE TABLE 表名(
列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
其他列…
);
- 如果在创建和修改的语句中没有指明字符集和比较规则,将使用该列所在表的字符集和比较规则作为该列的字符集和比较规则
临时转化字符集,可能导致错误发生
3.3.5 修改字符集
由于字符集和比较规则是互相有联系的,如果我们只修改了字符集,比较规则也会跟着变化,如果只修改了比较规则,字符集也会跟着变化,具体规则如下:
- 只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。
- 只修改比较规则,则字符集将变为修改后的比较规则对应的字符集
不论哪个级别的字符集和比较规则,这两条规则都适用。
3.3.6 小结
- 如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
- 如果创建或修改表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
- 如果创建或修改数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则
- 一个汉字在gbk中占两个字节,在utf8中占3个字节