客户端发送请求登陆成功之后,我们就可以使用键盘在黑框框中键入我们想要输入的MySQL语句,输入完了之后就可以点击回车键将该语句当作请求发送到服务器,可是客户端发送的语句(本质是个字符串)到底是采用什么字符集编码的呢?这其实涉及到应用程序和操作系统之间的交互,我们的MySQL客户端程序其实是一个应用程序,它从黑框框中读取数据其实是要调用操作系统提供的读取接口 。在不同的操作系统中,调用的读取接口其实是不同的,我们还得分情况讨论一下:
- 对于UNIX操作系统来说在我们使用某个输入法软件向黑框框中输入字符时,该字符采用的编码字符集其实是操作系统当前使用的字符集 。比方说当前 LC_ALL 环境变量的值为 zh_CN.UTF-8,那么意味着黑框框中的字符其实是使用utf8字符集进行编码 。稍后MySQL客户端程序将调用操作系统提供的read函数从黑框框中读取数据(其实就是所谓的从标准输入流中读取数据),所读取的数据其实就是采用utf8字符集进行编码的字节序列,稍后将该字节序列作为请求内容发送到服务器 。这样其实会产生一个问题,如果客户端的默认字符集和操作系统当前正在使用的字符集不同,那么将产生比较尴尬的结果 。比方说我们在启动客户端是携带了 --default-character-set=gbk 的启动参数,那么客户端的默认字符集将会被设置成gbk,而如果操作系统此时采用的字符集是utf8 。比方说我们的语句中包含汉字 '我',那么客户端调用 read 函数读到的字节序列其实是 0xE68891,从而将 0xE68891 发送到服务器,而服务器认为客户端发送过来的请求都是采用gbk进行编码的,这样就会产生问题(当然,这仅仅是发生乱码问题的前奏,并不意味着产生乱码,乱码只有在最后一步,也就是客户端应用程序将服务器返回的数据写到黑框框里时才会发生) 。
- 对于Windows操作系统来说在Windows操作系统中,从黑框框中读取数据调用的是Windows提供的 ReadConsoleW 函数 。在该函数执行后,MySQL客户端会得到一个宽字符数组(其实就是一组16位的UNICODE),然后客户端需要把该宽字符数组再次转换成客户端使用的默认字符集编码的字节序列,然后才将该字节序列作为请求的内容发送到服务器 。这样在UNIX操作系统中可能产生的问题,在Windows系统中却可以避免 。比方说我们在启动客户端是携带了 --default-character-set=gbk 的启动参数,那么客户端的默认字符集将会被设置成gbk,假如此时操作系统采用的字符集是utf8 。比方说我们的语句中包含汉字 '我',那么客户端调用 ReadConsoleW 函数先读到一个代表着 我 字的宽字符数组,之后又将其转换为客户端的默认字符集,也就是gbk字符集编码的数据 0xCED2,然后将 0xCED2 发送到服务器 。此时服务器也认为客户端发送过来的请求就是采用gbk进行编码的,这样就完全正确了~
推荐阅读
- Linux环境下MySQL安装
- 在MySQL官网下载安装数据库
- 非常重要的mysql数据库定时备份!
- mysql5.7 使用XtraBackup2.4 全量备份还原
- 染发剂中的3.0或4.0是什么意思?了解颜色代码,染啥颜色一目了然
- 西游记中的歇后语 白骨精给唐僧送饭的歇后语
- 请收好Netcat网络工具中的瑞士军刀,从此故障诊断不用愁!
- URI中的 “//” 有什么用?
- 末影龙能打败凋零吗?
- 观察中的发现作文示例5篇 观察中的发现作文
