MySQL个人学习笔记——字符集、校对集

字符集

字符集是多个字符的集合,计算机对字符的处理将按照着指定的编码规则进行。不同的字符集有着不同编码规则,如果将使用一种字符集处理过字符串转移到使用另一种字符集的环境中时将导致乱码。(如:utf8使用3个字节保存一个字符,gbk使用2个字节保存一个字符,在utf8环境中去处理gbk字符,utf8环境将读取3个字节,而此时已经超出gbk一个字符的字节并且可能读取了一个不属于该字符的存储字节,因此无法识别)

mysql支持多种字符集,创建数据库、表时可自行选择使用哪种字符集,但为什么有时会出现查询结果出现乱码?

mysql客户端(client,mysql.exe)与服务端(server,mysqld.exr)的连接关系

1、客户端向服务端传输数据
2、服务端给客户端返回结果
3、客户端与服务端的连接
而上述的三种关系都有各自使用的字符集

查询客户端与服务端的字符集变量

语法:show variables like ‘character_set%’;
MySQL个人学习笔记——字符集、校对集
下面对这3个变量进行一下测试字符集传入中文出错问题。
在windows环境下使用cmd来对mysql进行操作,cmd用的是gbk字符集。
MySQL个人学习笔记——字符集、校对集
当3个变量都为utf8,传入数据中文,将提示出错
MySQL个人学习笔记——字符集、校对集

将变量character_set_connection修改为gbk后,再插入一个中文
MySQL个人学习笔记——字符集、校对集
此时,插入不会报错,但查询结果为???,此时将变量character_set_results改为gbk,再查询一次,结果仍为???,由此可以排除是cmd无法识别服务器回传数据的可能。得出结论是服务器无法识别(使用utf8识别)客户端传入的数据(传入gbk),因此将传入的数据存为???
MySQL个人学习笔记——字符集、校对集

当cmd与服务器返回结果所用字符集不同时,显示结果为乱码
MySQL个人学习笔记——字符集、校对集
接下来,将character_set_clientcharacter_set_results均改为gbk,而character_set_connection为utf8,再插入中文
MySQL个人学习笔记——字符集、校对集
可以看到,插入和查询结果都正确了。
因此,可以得出,character_set_client控制服务器用哪种字符集识别客户端传入的数据,character_set_results控制服务器使用哪种字符集回传数据给客户端,character_set_connection不会导致数据传输出错。
connection:连接层作为字符转换的中间者,如果character_set_connectioncharacter_set_clientcharacter_set_results统一效率更高,不统一也不影响字符集的识别。

校对集

用于进行数据比较,区分大小写(只有进行比较操作才生效,如排序、分组)
有三种:
1、_bin:binary,二进制比较,取出二进制位,从左往右一位位比较,区分大小写
2、_cs:case sensitive,大小写敏感,区分大小写,但比较少用,多数用_bin
3、_ci:case insensitive,大小写不敏感,不区分大小写,一般默认
查看系统支持的大小写
语法:show collation;
MySQL个人学习笔记——字符集、校对集
下面对校对集进行一下测试
创建2个测试用表,各自校对集为utf8_bin和utf8_ci(校对集utf8默认为ci)
MySQL个人学习笔记——字符集、校对集
MySQL个人学习笔记——字符集、校对集
对这两个表插入同样的数据’a’、‘A’、‘b’、‘B’,使用select语句查询结果一样,因为查询不需要进行比较,所以校对集在这里没有发挥作用。
MySQL个人学习笔记——字符集、校对集
对这2个表进行排序
MySQL个人学习笔记——字符集、校对集
对这两个表进行分组
MySQL个人学习笔记——字符集、校对集
从以上的排序和分组测试中就可以明显看出校对集作用。