MySQL字符集产生乱码的简单讲解
//标题:MySQL字符集简单讲解(个人总结)
//作者:dx_andy
//时间:2007.8.27 晚
//测试环境:win32 MySQL 5.0.45
//原因:自己的MySQL出现乱码问题
MySQL自4.1版本推出之后为我们国人带来的乱码问题也随之风弥整个互联网。主要原因就是不同字符集编码不同而产生的。
先说一下MySQl的配置中都有哪几种字符集:
MySQL 4.1的字符集支持(Character Set Support)有两个方面字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
我们可以用下面命令检查MySQL当前字符集信息:
show variables like “character_set_%”;
show variables like “collation_%”;
MySQL4.1或以上版本的系统预设的编码是UTF-8,而我们的中文编码为:GBK,GB2312,BIG5……所以当我们把中文被当做别的字符集转化为UTF-8的字符集,再存入数据库时就会出现部分文字代码丢失而产生乱码。这就是我们查询数据库得到这些数据显示到网页上的就是“????”或乱码的原因。
解决办法吗?当然也很简单,网页上随便一搜就能搜到。
解决办法(1)就是在插入数据之前先设置一下MySQL的字符集,即:mysql_query(“set names gbk”) 或是将gbk改为gb2312 或是别的中文字符集。然后再执行插入操作。
《特》《别》《声》《明》
上面的办法在我电脑上测试成功。
但我多少感觉有些不舒服,每次查询前都要写mysql_query(‘set name gbk’);。这一点我挺不满意的。于是我又开始搜索,结果我找到了下面将要讲到的配置方法
解决办法(2):配置my.ini文件。打开my.ini 找到 [mysql] 找到default-character-set 如果你的mysql是默认安装的话这里应该是:utf8。这时将它改为:gbk或是gb2312就行了。( 即不在查询前加入mysql_query(“set names gbk”) )
《又》《出》《问》《题》《了》
我照上面的方法改了不知多少次,从gbk改到gb2312又改到utf8始终没能成功。我想了想,既然网页传值不能成功那么在命提示符下是什么样子的呢。
于是我用命令提示符打开了MySQL。测试发现在命令提示符下操作MySQL一切正常。弄到这里我的头都大了。
我又重新配置了一下PHP环境,下载的最新AppServ 2.5.9。检查一下MySQL字符集,默认字符集是UTF8。
MySQL命令:(show variables like “character_set_%”;)
然后我在不执行(mysql_query(“set names gbk”))时向数据库执行插入,查询操作,在网页上一切都显示正常。呵呵,真是怪了!
为什么中文字却能不加转换的插入到数据库中?
又为什么中文字能不加转换的从数据库中得到正确数据?
带着这两个问题我又打开命令提示符。执行查询操作,结果显示的全是乱码(当时我想的是:文字应该为GBK编码)。于是我又执行:set names gbk; 把这个数据库字符集改为GBK字符集。再执行查询结果显示的全部是问号。这到底是怎么回事,我真的不想再研究了。
我一气之下把my.ini文件的[mysql]栏的default-character-set 注释掉了。重启MySQL后,又执行了一下操作,结果真是大出意料呀,居然正常显示了。我兴奋的不的了。结果我又查询了一下当前mysql的字符集:呵呵居然是latin1。难道是这里在做怪?然后我用PHP插入数据,查询数据库(不执行 mysql_query(“set names gbk”)),结果照样显示正常。哈哈,问题终于找到了,原来真是这里在做怪!!!
我想看到这里大家已经应该明白了,下面我做一个小总结吧。
《最》《后》《总》《结》(只是个人见解,不负任何法律责任哦!)
(1) 在mysql5.0.45环境下,数据库把由PHP传递的数据默认为latin1 (ISO-8859-1) 字符集来处理。即把latin1转换为UTF-8,然后插入。
(2) 当PHP向MySQL数据库中插入数据前执行(mysql_query(“set names gbk”))MySQL才会以PHP查询中指定的字符集(gbk)转换为UTF-8后插入。
(3) CMD模式下操作MySQL,和用PHP操作在字符集处理上是两种概念。CMD下操作MySQL,MySQL会把CMD下的数据默认为MySQL默认的字符集转换为UTF-8后处理。而处理PHP数据MySQL会默认为 latin1 数据做处理。
《《《----我最后的配置----》》》:
因为我只是在本地作测试,为了测试时少写一行mysql_query(“set names gbk”)。所以我把 my.ini 的 [ mysql ] 栏default-characte_set 改为 latin1。这样无论自己在本地测试或是CMD下操作MySQL都很方便。但是如果你用的是PHPMyAdmin的话,可能会显示乱码,解决办法就是安装一个支持字符集为 latin1的PHPMyAdmin。字符集和字符集校对都为 latin1 ,就能正常显示了。
《关》《于》《数》《据》《库》《备》《份》
因为mysql4.1之前采用的中文字符集为 gbk 或 gb2312。建议备份和恢复数据库前先执行 set name gbk ;命令即可解决乱码问题。