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

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

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

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

首先,一个最重要的前提是:这些设置都是在mysql服务器

`client`和`server`坐在一起聊天,但 `client`很奇怪,它只说`binary`语言且只能听懂`gbk`语言,而`server`先生呢,比较全能,它听懂各种语言,也会说各种语言,但比较古板的是,它要将他们先翻译成自己的语言`gbk`(中国人和美国人聊天时的悲剧),于是悲剧发生了,`server`先生每次都要将`client`的`binary`话转成自己的`gbk`,理解了,想好答案了,然后用`gbk`说给`client`听

字符集关系简单就是:

1. `character_set_client` 确认client传过来的是啥字符  
2. `character_set_connection` 就是把客户端传过来的字符转换成服务器端的字符(`character_set_client`可能和`character_set_connection`不一样的时候)  
3. `character_set_results` 数据返回给客户端的神马字符集

详细如下:

  1. 当查询离开客户端后, 服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。

  2. 服务器接收到查询后要进行字符转换,转换时,服务器使用character_set_connectioncollation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。

  3. 服务器发送结果集或返回错误信息到客户端之前也要进行字符转换。character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。

  4. 说一下:set names utf8的作用:告诉服务器你的 character_set_clientcharacter_set_results 应该是 utf8字符集,也就是:我给你的查询语句和你给我的结果,都必须是utf8

  5. mysql特色:每一步都帮你想好了字符集可能不一样。深究起来,很多人都要哭,以上3个只是大众化了而已,如果细究起来还有数据库字符集(创建数据库时指定),表字符集(创建表是指定),列字符集(创建字段时指定),加上charset_server charset_filesystem....

具体见:http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html


这几日自行研究感悟+网友热心回答
最后,再此对mysql字符处理流程做出总结,供后人参考la~ la~ la~ ~~
遵循自己学野要学透的原则
所需知识点:
- 字符(亦就是文字,中文,英文,等等...)在视频最实在!自行跳到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等等....

假设你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

【热门文章】
【热门文章】