mysql乱码的成因和解决方法
[| 2010/09/01 22:59]
假如一段gbk编码的文字在插入数据库的时候set names latin1了,那么要在utf8格式网页上显示,应该怎么弄?
在这里数据库的编码是不重要的,只需set names latin1,然后读出来再用iconv从gbk转到utf8即可。
在期间其实数据库里存储的是“乱码”,只不过显示的时候编码正确而已。
假如gbk文字以utf8方式插进去了呢?那就需要以utf8方式读出来,再从gbk转到utf8。假如页面是big5,那就从gbk转到big5。
假如gbk文字以gbk方式插进去了呢?那就utf8方式读出来,直接显示。假如页面是big5,那就big5方式读出来,直接显示。这个期间所有的地方都不是乱码。
现在难度提升。
插入的时候不变。读出的时候set names big5。显示的时候想显示成utf8,怎么办?
答案是从big5转到latin1,再从gbk转到utf8显示。
注:从**转到**指的是把字符串当成**编码,将其转成**编码。
这个不好理解了吧,解释一下。
当插入的时候,我们其实在欺骗服务器,我们告诉服务器我们这个是latin1字符串,于是服务器就按latin1的方式理解了我们的字符串。理解后,将其转换成同含义的数据库字符集的串存起来。当我们取的时候,我们说:“请把数据库里的数据发一个big5编码的版本给我。”服务器就把自己存的那个含义转换成big5版本给我们。
这个时候,我们从big5转换成latin1,句子的含义不变。也就是说这个串就是我们当初给服务器的那个串。现在把这个串当成gbk来理解才会有正确的意思。所以我们把它当成gbk,转换成utf8,期间含义不变,我们得到了正确的字符串。
上面的讲解可能比较抽象,下面以小故事的形式来讲一下:小明会说法语,小丽会各种语言,小兰会说英语,浏览器只会说葡萄牙语。
小明用法语写了“我爱吃饭”,然后给了小丽,小丽以为是个荷兰语写的条子,于是按荷兰语的方式理解,她以为条子上写的是“天气不错”,于是在自己的本子上用意大利语写了“天气不错”。小兰很八卦,她跑过来问小丽:刚才小明写什么了?小丽用英语给她一个条子:“天气不错”。现在我们要想让浏览器正确理解小明说的什么,怎么办?
小兰现在知道小明说的那句话用荷兰语来理解的话是“天气不错”的意思。她又知道小明其实说的是法语。于是她认为第一步要先把小明写的那个条子还原。于是,她通过查字典,用荷兰语写了个条子。现在这个条子上写的东西和当初小明写的是一模一样的了。然后,她找了语言老师,请老师把这个法语条子改写成葡萄牙语的版本,并让老师转交给浏览器。浏览器拿到条子一看,写的是“我爱吃饭”。
在这里面,小明是写入时的客户端,小丽是数据库,小兰是读出时的客户端。浏览器是浏览器。
虽然浏览器正确的理解了小明说的话,但小丽和小兰并不知道小明到底说了什么。
在这里数据库的编码是不重要的,只需set names latin1,然后读出来再用iconv从gbk转到utf8即可。
在期间其实数据库里存储的是“乱码”,只不过显示的时候编码正确而已。
假如gbk文字以utf8方式插进去了呢?那就需要以utf8方式读出来,再从gbk转到utf8。假如页面是big5,那就从gbk转到big5。
假如gbk文字以gbk方式插进去了呢?那就utf8方式读出来,直接显示。假如页面是big5,那就big5方式读出来,直接显示。这个期间所有的地方都不是乱码。
现在难度提升。
插入的时候不变。读出的时候set names big5。显示的时候想显示成utf8,怎么办?
答案是从big5转到latin1,再从gbk转到utf8显示。
注:从**转到**指的是把字符串当成**编码,将其转成**编码。
这个不好理解了吧,解释一下。
当插入的时候,我们其实在欺骗服务器,我们告诉服务器我们这个是latin1字符串,于是服务器就按latin1的方式理解了我们的字符串。理解后,将其转换成同含义的数据库字符集的串存起来。当我们取的时候,我们说:“请把数据库里的数据发一个big5编码的版本给我。”服务器就把自己存的那个含义转换成big5版本给我们。
这个时候,我们从big5转换成latin1,句子的含义不变。也就是说这个串就是我们当初给服务器的那个串。现在把这个串当成gbk来理解才会有正确的意思。所以我们把它当成gbk,转换成utf8,期间含义不变,我们得到了正确的字符串。
上面的讲解可能比较抽象,下面以小故事的形式来讲一下:小明会说法语,小丽会各种语言,小兰会说英语,浏览器只会说葡萄牙语。
小明用法语写了“我爱吃饭”,然后给了小丽,小丽以为是个荷兰语写的条子,于是按荷兰语的方式理解,她以为条子上写的是“天气不错”,于是在自己的本子上用意大利语写了“天气不错”。小兰很八卦,她跑过来问小丽:刚才小明写什么了?小丽用英语给她一个条子:“天气不错”。现在我们要想让浏览器正确理解小明说的什么,怎么办?
小兰现在知道小明说的那句话用荷兰语来理解的话是“天气不错”的意思。她又知道小明其实说的是法语。于是她认为第一步要先把小明写的那个条子还原。于是,她通过查字典,用荷兰语写了个条子。现在这个条子上写的东西和当初小明写的是一模一样的了。然后,她找了语言老师,请老师把这个法语条子改写成葡萄牙语的版本,并让老师转交给浏览器。浏览器拿到条子一看,写的是“我爱吃饭”。
在这里面,小明是写入时的客户端,小丽是数据库,小兰是读出时的客户端。浏览器是浏览器。
虽然浏览器正确的理解了小明说的话,但小丽和小兰并不知道小明到底说了什么。