之前写过一篇MYSQL乱码问题是解决GBK的,但似乎并不能解决UTF-8的问题
1.
先说环境:
WINDOWS XP + WAMP SERVER V2.1(集成了php,mysql,apache等)
数据库结构为:数据库名itemlist, 表名student_info, 3个字段id, name, age. 其中name是varchar,使用的是utf8_general_ci
在创建数据库的时候能用utf8的都用了utf8
2. 乱码症状:
试验过程,共分2个文件,先来看一下
1)
//tablecommit.php
<form action="action.php" method="post">
<p>姓名: <input type="text" name="name" /></p>
<p>年龄: <input type="text" name="age" /></p>
<p><input type="submit" /></p>
</form>
2)
//action.php
<?php
$var_name=htmlspecialchars($_POST['name']);
$var_age=(int)$_POST['age'];
?>
你好,<?php echo $var_name; ?>。
你 <?php echo $var_age; ?> 岁了。
<?php
//db params
$dbserver="127.0.0.1";
$dbusername="root";
$dbpassword="";
$dbname="itemlist";
$dbconn=mysql_connect($dbserver, $dbusername, $dbpassword);
//open db
mysql_select_db($dbname, $dbconn);
//operate db test1
$table_name="student_info";
$querystr_select="select * from ".$table_name;
$queryresult1 = mysql_query($querystr_select);
echo "row count:".mysql_num_rows($queryresult1);
//operate db test2
$querystr_insert="insert into ".$table_name." (name,age) VALUES(\"".$var_name."\",\"".$var_age."\")";
$queryresult2 = mysql_query($querystr_insert);
echo "insert operation affected rows:".mysql_affected_rows($dbconn);
//close dbconn
mysql_close($dbconn);
?>
在乱码的时候,显示的中文在phpmyadmin是不可见的,貌似空白一样
3. 解决方案
1) 通过phpmyadmin来查看编码
使用
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1 //这里是不对的
character_set_system utf8
character_sets_dir c:\wamp\bin\mysql\mysql5.5.8\share\charsets\
2)改my.ini文件
在[client]下面加 default_character_set=utf8
在[mysqld]下面加 character_set_server=utf8
修改后重启MYSQL服务,再查看编码成了:
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir c:\wamp\bin\mysql\mysql5.5.8\share\charsets\
3)改php文件
<?php
header('content-type;text/html;charset=utf-8');
$var_name=htmlspecialchars($_POST['name']);
$var_age=(int)$_POST['age'];
?>
你好,<?php echo $var_name; ?>。
你 <?php echo $var_age; ?> 岁了。
<?php
//db params
$dbserver="127.0.0.1";
$dbusername="root";
$dbpassword="";
$dbname="itemlist";
$dbconn=mysql_connect($dbserver, $dbusername, $dbpassword);
//open db
mysql_select_db($dbname, $dbconn);
mysql_query("set names 'utf8'");
//operate db test1
$table_name="student_info";
$querystr_select="select * from ".$table_name;
$queryresult1 = mysql_query($querystr_select);
echo "row count:".mysql_num_rows($queryresult1);
//operate db test2
$querystr_insert="insert into ".$table_name." (name,age) VALUES(\"".$var_name."\",\"".$var_age."\")";
$queryresult2 = mysql_query($querystr_insert);
echo "insert operation affected rows:".mysql_affected_rows($dbconn);
//close dbconn
mysql_close($dbconn);
?>
另外, 有人说如果在WINDOWS的mysql命令行下,由于WINDOWS本身只支持GB2312/GBK方式,所以要 set names gb2312; 再插入数据,这实在是很BT。好在我一般不使用命令行,而使用phpmyadmin这种web方式来操作。
再补充一点:以我个人的习惯,把php文件本身也存成UTF-8格式的,不知道和消除乱码有关系没,请大家自己实验吧。
1.
WINDOWS XP + WAMP SERVER V2.1(集成了php,mysql,apache等)
数据库结构为:数据库名itemlist, 表名student_info, 3个字段id, name, age. 其中name是varchar,使用的是utf8_general_ci
在创建数据库的时候能用utf8的都用了utf8
2. 乱码症状:
试验过程,共分2个文件,先来看一下
1)
//tablecommit.php
<form action="action.php" method="post">
<p>姓名: <input type="text" name="name" /></p>
<p>年龄: <input type="text" name="age" /></p>
<p><input type="submit" /></p>
</form>
2)
//action.php
<?php
$var_name=htmlspecialchars($_POST['name']);
$var_age=(int)$_POST['age'];
?>
你好,<?php echo $var_name; ?>。
你 <?php echo $var_age; ?> 岁了。
<?php
//db params
$dbserver="127.0.0.1";
$dbusername="root";
$dbpassword="";
$dbname="itemlist";
$dbconn=mysql_connect($dbserver, $dbusername, $dbpassword);
//open db
mysql_select_db($dbname, $dbconn);
//operate db test1
$table_name="student_info";
$querystr_select="select * from ".$table_name;
$queryresult1 = mysql_query($querystr_select);
echo "row count:".mysql_num_rows($queryresult1);
//operate db test2
$querystr_insert="insert into ".$table_name." (name,age) VALUES(\"".$var_name."\",\"".$var_age."\")";
$queryresult2 = mysql_query($querystr_insert);
echo "insert operation affected rows:".mysql_affected_rows($dbconn);
//close dbconn
mysql_close($dbconn);
?>
在乱码的时候,显示的中文在phpmyadmin是不可见的,貌似空白一样
3. 解决方案
1) 通过phpmyadmin来查看编码
使用
SHOW VARIABLES LIKE "char%", 显示
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1 //这里是不对的
character_set_system utf8
character_sets_dir c:\wamp\bin\mysql\mysql5.5.8\share\charsets\
2)改my.ini文件
在[client]下面加 default_character_set=utf8
在[mysqld]下面加 character_set_server=utf8
修改后重启MYSQL服务,再查看编码成了:
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir c:\wamp\bin\mysql\mysql5.5.8\share\charsets\
3)改php文件
<?php
header('content-type;text/html;charset=utf-8');
$var_name=htmlspecialchars($_POST['name']);
$var_age=(int)$_POST['age'];
?>
你好,<?php echo $var_name; ?>。
你 <?php echo $var_age; ?> 岁了。
<?php
//db params
$dbserver="127.0.0.1";
$dbusername="root";
$dbpassword="";
$dbname="itemlist";
$dbconn=mysql_connect($dbserver, $dbusername, $dbpassword);
//open db
mysql_select_db($dbname, $dbconn);
mysql_query("set names 'utf8'");
//operate db test1
$table_name="student_info";
$querystr_select="select * from ".$table_name;
$queryresult1 = mysql_query($querystr_select);
echo "row count:".mysql_num_rows($queryresult1);
//operate db test2
$querystr_insert="insert into ".$table_name." (name,age) VALUES(\"".$var_name."\",\"".$var_age."\")";
$queryresult2 = mysql_query($querystr_insert);
echo "insert operation affected rows:".mysql_affected_rows($dbconn);
//close dbconn
mysql_close($dbconn);
?>
另外, 有人说如果在WINDOWS的mysql命令行下,由于WINDOWS本身只支持GB2312/GBK方式,所以要 set names gb2312; 再插入数据,这实在是很BT。好在我一般不使用命令行,而使用phpmyadmin这种web方式来操作。
再补充一点:以我个人的习惯,把php文件本身也存成UTF-8格式的,不知道和消除乱码有关系没,请大家自己实验吧。