首页 > Other > PHP + MySQL 正确处理中文的写法

PHP + MySQL 正确处理中文的写法

使用 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 种方式都试了试,结果都很好。不过我没有尝试将两种方法一起用

所走弯路

针对这个问题,PHP 中文乱码解决办法总结分析这篇文章介绍的还不错,可惜没有举例说明。正是因为这篇文章,我才找到了 php.net 上的那两个例子。

另外,时常总结一下自己方法论上的错误还是有必要的:

不能相信百度,一点儿都不能,就算 Google 不能用了也可以用 Bing 嘛——不知道百度怎么给文章排重要性的;
技术问题还是进行查英文文档吧,中文的太多胡拼乱凑东拿西借的文章了,乱删节不说,而且还不注明出处。更气愤的是这样的东西还被百度放在了搜索结果的前面;

分类:Other
  1. 还没有评论。
  1. No trackbacks yet.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: