
这几个系统变量在我的计算机上的默认值如下(不同操作系统的默认值可能不同): 
为了体现出字符集在请求处理过程中的变化,我们这里特意修改一个系统变量的值:
mysql> set character_set_connection = gbk;Query OK, 0 rows affected (0.00 sec)
现在假设我们客户端发送的请求是下边这个字符串:
SELECT * FROM t WHERE s = '我';
为了方便大家理解这个过程,我们只分析字符 ‘我’ 在这个过程中字符集的转换。
现在看一下在请求从发送到结果返回过程中字符集的变化:
1,客户端发送请求所使用的字符集 一般情况下客户端所使用的字符集和当前操作系统一 致,不同操作系统使用的字符集可能不一 样,如下:
- 类 Unix 系统使用的是 utf8
- Windows 使用的是 gbk
当客户端使用的是utf8 字符集,字符 ‘我‘ 在发送给服务器的请求中的字节形式就是:0xE68891
提示:如果你使用的是可视化工具,比如navicat之类的,这些工具可能会使用自定义的字符集来编 码发送到服务器的字符串,而不采用操作系统默认的字符集(所以在学习的时候还是尽量用 命令行窗口)。
2,服务器接收到客户端发送来的请求其实是一串二进制的字节,它会认为这串字节采用
的字符集是 character_set_client ,然后把这串字节转换为 character_set_connection 字符集编码的 字符。
由于我的计算机上 character_set_client 的值是 utf8 ,首先会按照 utf8 字符集对字节 串 0xE68891 进行解码,得到的字符串就是 ‘我’ ,然后按照 character_set_connection 代表的 字符集,也就是 gbk 进行编码,得到的结果就是字节串 0xCED2 。
3,因为表 t 的列 col 采用的是 gbk 字符集,与 character_set_connection 一致,所以直 接到列 中找字节值为 0xCED2 的记录,最后找到了一条记录。
提示:如果某个列使用的字符集和character_set_connection代表的字符集不一致的话,还需要进行 一次字符集转换。
4,上一步骤找到的记录中的 col 列其实是一个字节串 0xCED2 , col 列是采用 gbk 进行 编码的,所 以首先会将这个字节串使用 gbk 进行解码,得到字符串 ‘我’ ,然后再把 这个字符串使用 character_set_results 代表的字符集,也就是 utf8 进行编码,得到 了新的字节串: 0xE68891 ,然后发送给客户端。
5,由于客户端是用的字符集是 utf8 ,所以可以顺利的将 0xE68891 解释成字符 我 ,从 而显示到我 们的显示器上,所以我们人类也读懂了返回的结果。
总结图示如下: 
做个大致了解即可!
