php遍历mysql 字符集_php mysql 字符集(三) (转)

http://bbs.csdn.net/topics/390097514 gbk页面插入数据到utf8表,然后取出到gbk页面 首先,这个setnamesx等价于 SETcharacter_set_client=x; SETcharacter_set_results=x; SETcharacter_set_connection=x; 而这3个设置决定了不同阶段的字符集 ---------------

http://bbs.csdn.net/topics/390097514

gbk页面插入数据到utf8表,然后取出到gbk页面

首先, 这个set names x等价于

SET character_set_client = x;

SET character_set_results = x;

SET character_set_connection = x;

而这3个设置决定了不同阶段的字符集

------------------------------------

如果不加set names utf8

一般缺省情况下这3个设定都是latin1,你可以用show VARIABLES like 'character_set%'看一下

ok,这时,

字符集的变化情况是

gbk(输入页面)->latin1(character_set_client)->latin1(character_set_connection)->utf8(数据库)->latin1(character_set_connection)->latin1(character_set_results)->gbk(输出页面)

比如你输入一个"严"

"D1CF"(输入的一个gbk字符,被解释为2个latin1字符,因为你的client是latin1)

=>"D1""CF"(2个latin1字符ÑÏ)

->"c391""c38f"(2个utf8字符,进db,注意这时是4个字节,2个字符)

->"D1""CF"(2个latin1字符ÑÏ)

没了....

嗯?为啥没了还能在页面上看到正确的汉字"严"???

如果你在页面上"查看源代码", 你会看到那是"乱码"(latin字符)

这个是因为html页面是流方式输出到浏览器,浏览器只知道接受一串字符过来,然后根据你指定的编码,比如

来分析显示字符,注意2个latin1字符D1CF和一个gbk汉字严在二进制下是无法区分的,所以它就解释其为汉字,

如果你charset=ISO-8859-1了,它就变"乱码"了

-----------------------------------------------------------------

好, 这下来说set names utf8后, 就是

set character_set_client = utf8;

set character_set_results = utf8;

set character_set_connection = utf8;

那么,字符集变化为

gbk(输入页面)->utf8(character_set_client)->utf8(character_set_connection)->utf8(数据库)->utf8(character_set_connection)->utf8(character_set_results)->gbk(输出页面)

那么"严"的变化为

"D1CF"(输入的一个gbk字符,因为你client是utf8....被当成utf8字符)

->但是...好像不是合法的utf8字符....所以...(这步我没测试,到底转成了什么我也不知道)

->"乱码"(?个utf8字符)(存入数据库)

->"乱码"(原样取出并传到客户端,因为db和results都是utf8)

页面上就更是乱码了,而且无法变化页面字符集来得到正确的汉字

----------------------------------------------------------

所以,很多人都知道,你的这个情况应该set names gbk,就是

set character_set_client = gbk;

set character_set_results = gbk;

set character_set_connection = gbk;

那么,字符集变化为

gbk(输入页面)->gbk(character_set_client)->gbk(character_set_connection)->utf8(数据库)->gbk(character_set_connection)->gbk(character_set_results)->gbk(输出页面)

那么"严"的变化为

"D1CF"(输入的一个gbk字符,因为你client是gbk,所以被正确解释成gbk字符)

->"e4b8a5"(一个utf8字符,进db,注意这时是3个字节,1个字符)

->"D1CF"(转回正确的gbk字符)

这时你"查看源代码",应该也是正确的字符"严"

---------------------------------------------------------

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值