我相信大多数像我一样的新手,如果刚开始使用phpmyadmin,或者mysql,都被phpmyadmin的中文乱码问题折磨过,这不奇怪,谁叫人家是瑞典人开发的呢?
我 之前的情况是这样的:糊里糊涂的设置了字符集,使得通过php程序插入的数据,都能正确的反馈在网页上,而在phpmyadmin中则显示为乱码,但通过 phpmyadmin手工插入的数据则在phpmyadmin中显示没问题,但在网页上显示为乱码。当时我的字符集设置为
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
为了解决这个问题,我在网上搜了好久,结果是众说纷纭,把自己的头都搞大了也没搞出个所以然来。当时由于程序能够正常运行,而且一般也不通过phpmyadmin来手工处理数据,就没有处理。
但最近问题来了,由于有个注册页有个性别的radio,我在数据库里选择用enum数据类型,即enum('男','女'),结果由于之前的原因,怎么也插入不进去。被迫重操旧业,继续搜看。
又是一个艰苦的过程,不过这回找到了问题的关键所在:
Mysql 的字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。其默认的字符集设置为latin1,也就是 说无论在那个层次上,只要你没有经过改动,字符集均为latin1。与页面和数据库显示紧密相关的就是我做红色标记的三项:
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_results | latin1 |
大 家注意到我当时的字符集设置为latin1,我们可以理解为我的客户端,网页向数据库传送时将字符集为gb2312的中文按照latin1编码为了瑞典文 (乱码),即在phpmyadmin中显示为乱码,当时我的字符集连接校对为utf8-unicode-ci,数据库以及数据表的字符集均为:utf8- unicode-ci,这是个多语言字符集,可以处理存储瑞典文,影响不大,然后再用php程序输出数据是将该瑞典文按latin1字符集编码还原为中 文,这时在网页上显示没有问题就不难理解了,通过latin1编码的中文,要想再还原为中文,解铃还须系铃人,必须还要用latin1字符集编码,这就是 默认的字符集设置。
明白了原因,做起来就容易了,我们此时应该明白:
1.要想在phpmyadmin中显示中文,就必须将网页传送的数据用中文字符集(gb2312或者gbk)来编码;
2.要想在网页中显示中文,就必须使用和前者相同的编码方式来处理数据库将要传送给网页的数据;
3.至于数据库,数据表的字符集设置,没有特殊要求,只要能够存储中文就好,例如utf8、gb2312、gbk;
4.还有一个连接校对的设置,此时应设置为和第一点相同的字符集;
如果你的Mysql字符集是这样设置的,那么恭喜你,你已经可以让中文在你的数据库中正常工作了。
最后我把我的字符集设置提供如下,仅供参考:
+--------------------------+------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | D:websiteVerServMysqlsharecharsets |
+--------------------------+------------------------------------------+
可以看出数据库是字符集为utf8,数据表继承数据库的设置也为utf8
但其他还是默认设置,为了能够正常显示中文,我们作如下改动:
在每次执行查询之前都加上如下语句:
mysql_query("set names 'gbk'");
就可以确保
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_results | gbk |(注意这只是此次查询时,查看数据库仍为latin1)
然后我们将phpmyadmin的连接校对设为gbk-chinese-ci,赶快插条记录试试,大功告成!