3-1
字符集
字符集是个字符范围,字符集的编码是这个范围的编码规则(如何解释0101010)。
相关服务:德国服务器
重要的字符集
ASCII、ISO8859-1(Latin)、GB2312、GBK、Unicode
ISO在ASCII上扩充了128个德国法国常用的字母。
比较规则
一种字符编码可以有多种比较规则,比如考虑重音、不考虑重音、考虑大写、不考虑大写等。
3-2
utf8mb3和mb4的区别在,mb3是阉割版的,只会使用1-3个字节编码字符。阉割掉了一些不常用的emoji以提升性能。但是8x版本mb4已经优化的很好了,默认就是mb4。
查看字符集

show (character set | charset) [like 匹配的模式];
查看比较规则
show collation [like 匹配的模式];
比如utf8_general_ci,表示utf8编码,针对通用语言、case intensive。(区分大小写就是case sensitive, cs)
3.3
mysql的字符集和比较规则有四个级别,分别是服务器级别、数据库级别、表级别、列级别。
服务器级别
character_set_server 服务器级的字符集
collation_server 服务器级别的比较规则
show variables like ........ 查看
数据库级别
create database xxxxx character set gb2312 collate gb2312_chinese_ci;
alter database ......
变量名
character_set_database
collation_database
注意这两个变量只能查看,我们不能通过修改这两个变量来修改数据库的字符集和比较规则
表级别
CREATE TABLE t(col VARCHAR(10)) CHARACTER SET utf8 COLLATE utf8_general_ci;
列级别
ALTER TABLE t MODIFY col VARCHAR(10) CHARACTER SET gbk COLLATE gbk_chinese_ci;
如果你没指定数据库级别的字符集和排序规则,就会用服务器级的, 如果没指定表级的,就会用数据库级的。如果没指定列级的,就会用表级的。
无论修改字符集还是修改比较规则,都会影响另一个。
修改字符集会把比较规则变成目标字符集的默认比较规则。修改比较规则会把字符集变成修改后的比较规则对应的字符集。
字符集转换
在客户端发送请求,服务器返回响应的过程中,其实经历了多次的字符集转换。
客户端发送
我们把客户端与服务器进行通信的过程中事先规定好的数据格式称为MySQL通信协议。
一般来说,客户端使用的字符集与OS使用的字符集一致。如果OS使用的字符集是ASCII,则MySQL会使用latin1。如果MySQL不支持OS现在用的字符集,会把客户端用的字符集设置成默认字符集。在5.7以前是latin,现在是utf8mb4。
当使用类UNIX系统时
LC_ALL
LC_TYPE
LANG
这三个环境变量决定了os使用的字符集是哪个。从上往下优先级递减。
我的mac只有LANG这个变量。
这个字符集可以在连接时通过default_character_set选项来指定。
服务端接收
服务器接收到请求后,会用character_set_client这个变量(SESSION级)解码。注意这个变量和客户端实际编码用的变量不一定是相同的。如果这个变量对应的字符集不能解释客户端发来的数据,就会报警。
服务端处理
这一步其实稍微显得有点冗余。主要是因为一个语句在不同的字符集下可能有不同的意义。character_set_connection这个变量就是服务端用来处理sql语句用的字符集。
值得注意的是,服务端处理的字符集和表中那一列的字符集不一定一样,这时候表中数据的字符集优先级更高!
服务端生成响应
我们会把结果从处理时的字符集转化为character_set_results变量指定的字符集,发送给客户端。
客户端接收响应
一般来说,会用OS当前的字符集去解释服务器发回来的内容。
总结
总的来说一共有5个字符集(编码),分别是客户端实际使用的、服务器预期的、服务器处理时使用的、服务器发送的、客户端实际解码用的。





