首页 > 开发 > MySQL > 正文

mysql对client发过来的字符处理流程?

2017-09-08 09:11:07  来源:网友分享

从client开始到server再返回client,具体流程是?假设字符编码设置为:

character_set_client = binary; character_set_connection = gbk;character_set_results = gbk;

解决方案

这几日自行研究感悟+网友热心回答
最后,再此对mysql字符处理流程做出总结,供后人参考la~ la~ la~ ~~
遵循自己学野要学透的原则
所需知识点:
- 字符(亦就是文字,中文,英文,等等...)在计算机中是如何存在的?
计算机所有数据在存储时都是以数字(二进制)方式存储在存储设备里。字符亦不例外,在你键盘输入字符时,计算机将你的字符编成特定的数字,保存在存储设备里,这就是字符编码。不同的文字(字符)可以使用不同编码方式得到数字(010101这类的神马二进制),由你选择很人性很和谐,然后将数字保存入存储设备。so讲到底底,字符(我们所说的文字)是以编码后的二进制数字(一堆0,1)在计算机里存在的。
讲多无谓,来视频最实在!自行跳到20分18秒耐心观看,有点枯燥。
- 你要知道mysql是以客户端client /服务端server的结构运作
YOU比喻成M女士,客户端比喻作土豪金版iphone,客户端比喻作007。当你要007去执行任务时就必须通过iphone(好吧,我知道这有点牵强orz)
流程:你-->通过iphone发送指令-->007去执行
- 在mysql里,client与server之间的数据是通过TCP/IP协议传输的:
亦就是讲,要将client的数据发送到server上要通过TCP/IP协议管道,反之,server要将数据回送到client上,亦要通过TCP/IP协议管道传输。
这里全文上下所讲的数据就是二进制数字,其中就包含了你在计算机上输入的字符(文字)编码后的二进制数字。
OK,正题开始,mysql字符处理流程:
- 首先,你要明白client输入的文字(字符)是以编码后的二进制数字在计算机内存中存在的,这个client环境是使用什么编码方式,是由你或系统所设置,并不受mysql影响。
- 输入完命令,回车后,client上的数据(二进制数字)通过TCP/IP协议管道传输到server。但是你要注意到,当前你client使用的编码方式可能与server上正在使用的不一样!
- character_set_clientcharacter_set_connectioncharacter_set_results都是设置编码方式,如gbk,utf8等等....

  • character_set_client的设置可以告诉server知道你当前client正在使用什么编码方式。server就清楚client发送过来的数据是使用何种方式编码的,它就好将这些数据使用client的编码方式来正确解码,得到你在client输入的文字(字符)。如果你设置的编码方式与client的不一致,解码后的文字会和你在client上输入的不同。
  • character_set_connection的设置告诉server它,当接收完client传输过来的数据并通过character_set_client设置的编码方式正确解码后,接下来将这些文字将用什么编码方式来保存。
  • character_set_results的设置告诉server它,当命令执行完成时,返回给client的字符是用什么编码方式。

假设你client发送的命令是:insert into dome(text1,text2) values('钓鱼岛是中国的','苍井空是世界的');
命令(你发送过来的数据),你要注意,当前命令在server上已经,经过了正确解码,再重新编码了的。然后将命令转换成dome表当前使用的是编码方式,保存进去。

假设你client发送的命令是:select * from doem ;
命令(你发送过来的数据),你要注意,当前命令在server上已经,经过了正确解码,再重新编码了的。当select * from doem ;执行时,mysql会先分析出dome表当前使用的是什么编码方式,然后将查询得到的文字通过character_set_results设置的编码方式进行编码后再返回给client。

实在写不动了,只要命令里涉及到字符(文字)操作的,mysql就会将字符编码转换成对应,等对的字符编码后再执行。Zzzzz