MySQL字符集产生乱码的简单讲解
发布时间:2020-12-12 02:19:32 所属栏目:MySql教程 来源:网络整理
导读:MySQL 4.1的字符集支持(Character Set Support)有两个方面字符集(Character set)和排序方式(Collation)。 //标题:MySQL字符集简单讲解(个人总结) //作者:dx_andy //时间:2007.8.27 晚 //测试环境:win32 MySQL 5.0.45 //原因:自己的MySQL出现乱码问题 MyS
MySQL 4.1的字符集支持(Character Set Support)有两个方面字符集(Character set)和排序方式(Collation)。 //标题: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 ;命令即可解决乱码问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |