使用PHP+Mysql+Apache写网页可谓是黄金搭档,但是Mysql的中文乱码问题也是很令人蛋疼。
楼主最近在实习,boss让我写一个网页,可是mysql一直出现中文乱码的问题,中文乱码本质上来说就是字符集不统一的问题,网络上关于出现乱码的原因、解决方案很多,但是却没有一篇非常详细、正确的文章,我就把自己的一些理解、实验法上来,希望给后面的人一些指点。
我的邮箱是zhulicong89@gmail.com,有问题的话直接电邮我。
记住:必须将所有可以设置字符集的地方都设置成同一个字符集,可以是utf8,可以是gbk,可以是gb2312。
我就采用了utf8格式。
1.查看自己建的数据库的编码
Show create database snet; 注:snet是我数据库的名称。
+----------+---------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------+ | snet | CREATE DATABASE `snet` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+---------------------------------------------------------------+ 1 row in set (0.00 sec)
如果不是utf8,那就设置成utf8 Alter database snet character set utf8; //将snet数据库的字符集改成utf8
2.查看自己建的表的编码Show create table obj_type; //查看obj_type表的编码
结果如下: )ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 | 我只显示了最后一段,表的结构没有显示出来。
如果不是utf8,那就设置成utf8 Alter table obj_type character set utf8. //修改obj_type表的编码
注:第一步与第二步的查看,可以在新建数据库与表的时候就完成,代码如下:Create table user( Username varchar(255), Password varchar(255) )charset=utf8; //一开始就设置好编码的格式。
3.写了一个简单的网页,发现是乱码1 <html> 2 <head> 3 // <meta http-equiv="Content-Type" content="text/html; charset=utf8"/> 4 </head> 5 6 <body> 7 <form action="test.php" method="POST"> 8 名字: <input type="text" name="name" /> 9 <input type="submit" /> 10 </form> 11 </body> 12 </html>
不加第三行,出现乱码:
将第三行的// 去掉,则显示正常
为什么会出现这样的结果呢?
原因如下:
浏览器打开某个网页的时候,都是有一个默认的编码格式,有一些是gbk,有一些是gb2312,有一些是utf8. 谷歌的Chrome我不知道在哪里设置打开的编码格式,但是对于ie,以及firefox,都可以对着网页右击,编码总选择打开的方式。
4.写了简单的html页面,再写简单的php页面
在test.php页面如下信息,就是一个form,添加一条记录 1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf8"/> 4 </head> 5 6 <body> 7 <form action="add.php" method="POST"> 8 名字: <input type="text" name="name" /> 9 <input type="submit" /> 10 </form> 11 </body> 12 13 </html> 在add.php页面代码如下 1 <html> 2 <body> 3 名字<?php echo $_POST["name"]; ?> 4 </body> 5 </html> 6 7 <?php 8 9 // header('Content-Type:text/html; charset=utf8'); 10 11 $con=mysql_connect("localhost","root","aaa"); 12 mysql_select_db("snet",$con); 13 14 mysql_query("SET NAMES utf8"); 15 16 $sql="insert into obj_type values (null,'$_POST[name]')"; 17 18 mysql_query($sql,$con); 19 20 echo "1 record added"; 21 mysql_close($con); 22 23 24 ?>
在网络上搜索php+mysql+中文乱码,一般都会让你添加第14行,我也是这么添加的。
这样可以在mysql数据库中查看自己添加的内容。
我是使用putty远程登录的,使用utf8查看,竟然发现输入的内容是乱码。然后改成gbk查看,竟然可以。。。这个不知道是为什么。
5.再编写查看数据库内容的网页
名称为watch.php,从数据库select数据1 <?php 2 3 header('Content-Type:text/html; charset=utf8'); 4 ini_set("display_errors","off"); /*关闭警告*/ 5 6 include_once("db_fun/db_operation.php"); 7 8 $obj=new DB_Operation(); 9 $link=$obj->conn_db('snet'); /*链接数据库*/ 10 11 $result=mysql_query("select * from obj_type"); 12 13 echo "<table border='4'> 14 <tr> 15 <th>Id</th> 16 <th>Name</th> 17 </tr>"; 18 19 while ($row=mysql_fetch_array($result)){ 20 echo "<tr>"; 21 echo "<td>" . $row['id'] . "</td>"; 22 echo "<td>" . $row['name'] . "</td>"; 23 echo "<tr>"; 24 } 25 echo "</table>"; 26 27 28 $obj->disconn_db($link); 29 ?>
注意:一定要添加第三行
这一行的意思是:
如果该php页面,使用utf8编码,这个和前面第三步的html使用 <meta http-equiv="Content-Type" content="text/html; charset=utf8"/>是一样的道理。(其实是不是一样的道理,我也不是很懂,呵呵)。
以上
7 include_once("db_fun/db_operation.php");
8 $obj=new DB_Operation();
9 $link=$obj->conn_db('snet'); /*链接数据库*/
这几个都是我自己写的类,朋友们如果看不懂的话,可以去w3cschool的php教程里面直接访问mysql的代码