使用 PHP 编程连接 MySQL 数据库的时候,如果从网页上提交中文字符,存入数据库之后在 phpMyAdmin 中查看,可能会发现原本应该是中文的字符变成了乱码。这个问题很容易处理,可是我却花了三个多小时才搞定。记录正确的处理方法,还有在解决这个问题上所走的弯路。
最近一直在忙着编程,累得头晕眼花。兴冲冲的编好一部分程序之后进行测试,突然发现通过网页表单提交的中文字符,在数据库中显示为乱码。那叫一个郁闷啊。
这是必须优先解决的问题。于是 Google 百度齐上阵(其实如果不是 Google 的某些结果被K了,我才懒得用百度),还翻了一堆源码。绕了很多弯之后发现问题解决方法异常简单,简单得我想一头撞死在豆腐上。
方法及说明¶
早在开始写程序之前就已经为了避免字符编码问题决定使用 UTF-8 编码,可是还是有一点没料到。唉,经验不足啊。这事儿在以前搞 UseBB 的中文翻译的时候就遇到过,可是一直似懂非懂的。
首先,网页编码使用 UTF-8,数据库存储(Collation)选择 uft8_general_ci。这一点没问题。
其次,还需要在 PHP 代码中进行数据库连接之后,在查询之前设定编码处理方法。有 2 种方法都能设定:
- 对于 MySQL 5.0.7 及其以后版本,可以使用下面的
mysql_set_charset
函数,这也是官方推荐的方法<?php $link1 = mysql_connect('localhost','user1','pass1',TRUE); $link2 = mysql_connect('localhost','user1','pass1',TRUE); mysql_selectdb('db1',$link1); mysql_selectdb('db2',$link2); mysql_set_charset('latin1',$link1); mysql_set_charset('utf8',$link2); ?>
上例中标记为红色的语句即是。这是 php.net 上的一个例子,简明扼要。在第一段建立了 2 个数据库连接来进行对比;第二段分别选定不同的数据库 db1 和 db2,使用不同的变量 $link1 和 $link2;第三段上面一行使用 latin1 字符集,下一行使用 utf8 字符集(CharSet)。配合前面的设定,采用这样的字符集设置就可以保证网页和数据库中的中文都是正常显示的。特别要注意的是,第一段中括号里结尾的 TRUE 不能少,不然变量 $link1 和 $link2 在设置字符集的时候是不区分的(因为它们有相同的源 id#),因而两个数据库都被设置为使用 utf8 字符集进行连接。
- 对于 MySQL 4、5 都能用的方法如下,但是官方不推荐使用这个方法
<?php $db = mysql_connect('YOUR_DB_ADDRESS','YOUR_DB_USER','YOUR_DB_PASS') or die("Database error"); mysql_select_db('YOUR_DB', $db); //SOLUTION:: add this comment before your 1st query -- force multiLanuage support $result = mysql_query("set names 'utf8'"); $query = "select * from YOUR_DB_TABLE"; $result = mysql_query($query); //-THE_REST_IS_UP_TO_YOU- ?>
上例中,在进行数据库查询之前(蓝色语句)使用 mysql_query(“set names ‘utf8′”) 对查询方式进行设置(红色),完成任务的就是红色语句。
我出于好奇,这 2 种方式都试了试,结果都很好。不过我没有尝试将两种方法一起用 :D
所走弯路¶
针对这个问题,PHP 中文乱码解决办法总结分析这篇文章介绍的还不错,可惜没有举例说明。正是因为这篇文章,我才找到了 php.net 上的那两个例子。
另外,时常总结一下自己方法论上的错误还是有必要的:
- 不能相信百度,一点儿都不能,就算 Google 不能用了也可以用 Bing 嘛——不知道百度怎么给文章排重要性的;
- 技术问题还是进行查英文文档吧,中文的太多胡拼乱凑东拿西借的文章了,乱删节不说,而且还不注明出处。更气愤的是这样的东西还被百度放在了搜索结果的前面;
本文发表于水景一页。永久链接:<http://cnzhx.net/blog/right-way-to-deal-with-php-mysql-chinese-utf8/>。转载请保留此信息及相应链接。
虽然进到phpmyadmin里头看的时候是乱码,那你网页上调用显示的中文正常吗?
网页上当然正常了,不然开始就知道有问题了
那你有试过把phpmyadmin里头的Language选项设置成中文吗?我之前也有遇到这样的问题,结果把这里改成中文,就什么都好了。
刚才特地把那个语句注释掉,然后按你说的设置操作,新提交一句中文,结果发现数据库里是乱码。
那么奇怪,晕了,主要是我现在没碰到,之前在verydz上遇到的,自己的博客编码是utf8,可在phpmyadmin里头看表里的内容都是一堆乱码,结果就咨询了verydz官方,按照他说的这个方法,改回中文后,就一切都显示正常了。
那你现在既然能解决了,也就算了。
嗯,情况不同。WordPress 是支持 utf8 做简体中文输入的。这种情况下数据库里有乱码就多半是数据库页面上的编码不对了。跟文中引用的那个 UseBB 语言包的问题差不多。
哦,没建议上,到又让我学会了一点。
呵呵,反正已经解决了。这样讨论也挺好的。
又折腾,该开学了吧?
技术问题确实是英文好使,中文查出来的经常是猴年马月的东西,而且不严谨。
这方面你一直做的很好,写东西不怕麻烦,力求详实严谨。
呵呵,多谢夸奖!
该开学了,有些任务没完成,现在正加班加点的干活呢。
引用通告: 在讨论区更改 UseBB 页面编码格式导致乱码 « 水景一页