从client开始到server再返回client,具体流程是? 假设字符编码设置为:
character_set_client = binary;
character_set_connection = gbk;
character_set_results = gbk;
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这几日自行研究感悟+网友热心回答
最后,再此对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_client,character_set_connection,character_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
首先,一个最重要的前提是:这些设置都是在mysql服务器
字符集关系简单就是:
详细如下:
当查询离开客户端后, 服务器使用
character_set_client变量作为客户端发送的查询中使用的字符集。服务器接收到查询后要进行字符转换,转换时,服务器使用
character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。服务器发送结果集或返回错误信息到客户端之前也要进行字符转换。
character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。说一下:
set names utf8的作用:告诉服务器你的character_set_client和character_set_results应该是utf8字符集,也就是:我给你的查询语句和你给我的结果,都必须是utf8mysql特色:每一步都帮你想好了字符集可能不一样。深究起来,很多人都要哭,以上3个只是大众化了而已,如果细究起来还有数据库字符集(创建数据库时指定),表字符集(创建表是指定),列字符集(创建字段时指定),加上
charset_servercharset_filesystem....具体见:http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html