MySQL的字符编码体系(二)――数据传输编码_MySQL
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL的字符编码体系(二)――数据传输编码_MySQL,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3269字,纯文字阅读大概需要5分钟。
内容图文
![MySQL的字符编码体系(二)――数据传输编码_MySQL](/upload/InfoBanner/zyjiaocheng/579/c23a321fe5c4482ca2578704c22e51a9.jpg)
MySQL的客户端可以分为两种:一种就是用C语言写的官方客户端――MySQL命令程序;一种就是平常程序员使用JDBC等connector API写成的客户端。这里只讨论第一种。
Windows客户端
MySQL命令程序在Windows和Linux系统中关于字符编码处理的部分并不等效,下图是Windows系统的客户端字符编码转换逻辑:
其中的三个character变量存在于服务器上,而charset_info存在于客户端。
当客户端启动连接到服务器时,客户端将根据配置参数设置charset_info为指定编码,同时通知服务器让服务器把三个character变量设置为相同编码。
数据传输流程
客户端从控制台标准输入读取一行命令文本,其编码为操作系统编码;客户端将命令从系统编码转码为客户端charset_info变量设定的编码;客户端将命令文本发送给服务器;服务器把收到的文本解码为character_set_client编码,这个编码通常与客户端charset_info一致;服务器把命令文本转码为character_set_connection;服务器执行命令,产生结果;将结果转码为character_set_results发送给客户端;客户端把收到的结果解码为charset_info编码,这个编码通常与character_set_results一致;客户端将结果转码为操作系统编码,输出到控制台标准输出。由于在Windows平台上MySQL程序在读取控制台时使用了Unicode Console Read API,所以程序从控制台获取的原始字符串实际上是UTF16编码,所以这里的“操作系统编码”并不是Windows通常的GBK,而应该看做UTF16。
Linux客户端
下图是Linux系统中的MySQL客户端程序字符编码转换逻辑:
<img src="http://img.bitscn.com/upimg/allimg/c140719/1405K450264060-2K64.jpg" alt=""http://www.bitsCN.com/kf/ware/vc/" target="_blank" class="keylink">vcyoTXlTUUy/zbuntsuy6dGvzazSu7j2se21w7W9tcTItMrHwtLC66GjPGJyPgq/ydLU1eLR+cSjxOLJz8r2tcTH6b/2o7o8YnI+CrS0vajSu7j2se2jrMbk1tDWu7D8uqzSu7j2R0JL19a3+7Su19a2zrrNVVRGONfWt/u0rtfWts6ho0xpbnV41tDG9LavTXlTUUzBrL3Ttb3K/b7dv+K3/s7xxvejrL2rt/7O8cb3tcTI/bj2Y2hhcmFjdGVyseTBv7TTxKzIz7XEVVRGONDeuMTOqkdCS6Gjz/LK/b7dv+Ky5cjr1tDOxMr9vt2jrMGivLRzZWxlY3SjrL3hufvO3tLss6OjujwvcD4KPHA+PGltZyBzcmM9"http://www.bitsCN.com/uploadfile/Collfiles/20140714/2014071409163740.png" alt="/">
但是使用Windows的MySQL客户端查询时,结果却是乱码:
乱码分析
结合前面的数据传输流程,就能知道问题出在什么地方:
客户端从终端读取了一行utf8编码(Linux默认)的命令文本,忽略charset_info变量,直接把文本发送给服务器;服务器因为事先的命令charset gbk把三个character变量都设置为了GBK,所以服务器认为收到的文本是GBK编码;接下来服务器会不经过任何转码将文本字符串直接存入数据表中,因为数据表第一个字段也是GBK。到这里为止,数据表中存了一个UTF8字符串,而服务器却当它是GBK,在同一个Linux客户端查询时:表中的字符串不经过任何转码直接发给客户端,因为character_set_results也是GBK;客户端收到查询结果后因为忽略charset_info而直接不经过转码输出到终端标准输出;终端得到的数据实际上是UTF8编码的,所以正常输出。在Windows客户端查询时:
表中的字符串(UTF8)不经过任何转码直接发给客户端,因为character_set_results也是GBK;客户端收到查询结果后认为是charset_info编码(此时为GBK);客户端把查询结果从charset_info转码为UTF16,然后调用Unicode Console Write API输出,看到乱码。
乱码“修复”
如果Windows客户端也想看到正确的结果,那就要故意错误地配置:
执行命令charset utf8,这会将charset_info和三个服务器character都设置为UTF8;执行命令set names gbk,这只会将三个服务器character设置为GBK;现在select,结果看上去不再乱码了。内容总结
以上是互联网集市为您收集整理的MySQL的字符编码体系(二)――数据传输编码_MySQL全部内容,希望文章能够帮你解决MySQL的字符编码体系(二)――数据传输编码_MySQL所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。