Mysql数据库中文乱码解决方法总结
最近还在不断完善WBlog博管程序,到现在为止,WBlog还没有安装程序,这两天正忙着写,到这里安装程序已告一段落,基本上可以安装了,但就是还没有检测PHP版本和MYSQL版本的一些参数的设置功
能。测试过程中,发现插入到数据库的中文出现乱码,我不断地修改,不停地运行,前前后后起码几十次,我把这些过程的相关数据都记录下来了,以待整理。这次我要弄出个所以然来。以前也遇到过
数据库乱码相关的问题,但问题解决后,也不问个为什么,就这样不了了之了,久之,当再次发现后又忘记怎么解决了,于是又花好些时间到网上去搜寻答案,始终没有走出这个怪圈。趁着这次难得的
机会,要将数据库中文乱码一网打尽!
插入数据库的中文产生乱码的原因,可能有以下三个因素的影响:
1、数据表字符集的设置"CHARSET=字符编码"
2、PHP文件的编码"<meta http-equiv="Content-Type" content="text/html; charset=字符编码" />"
3、存数据前是否执行mysql_query("set names 字符编码")语句。
数据表字符集的设置
下面是我要用来测试的sql数据
代码如下 | |
01 "CREATE TABLE `wb_node` ( 02 `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, 03 `name` varchar(20) NOT NULL, 04 `title` varchar(50) NOT NULL, 05 `ord` tinyint(3) NOT NULL DEFAULT '0', 06 `status` tinyint(1) NOT NULL DEFAULT '0', 07 `remark` varchar(150) NOT NULL, 08 `sort` smallint(6) unsigned NOT NULL, 09 `pid` smallint(6) unsigned NOT NULL, 10 `level` tinyint(1) unsigned NOT NULL, 11 PRIMARY KEY (`id`), 12 KEY `level` (`level`), 13 KEY `pid` (`pid`), 14 KEY `status` (`status`), 15 KEY `name` (`name`) 16 ) ENGINE=MyISAM CHARSET=utf8;" |
上面数据表的表字符集为"CHARSET=utf8",当然支持中文的还可以是"CHARSET=gbk"或者"CHARSET=gb2312"
PHP文件的编码
php文件编码我是用Adobe Dreamweaver CS5生成的,如图所示:
执行sql编码语句
代码如下 | |
01 $link = mysql_connect($mysql_host, $mysql_user, $mysql_pass)) { 02 echo "数据库连接失败! 请返回上一页检查连接参数 "; 03 } else { 04 if(mysql_query("CREATE DATABASE `$mysql_dbname`")){ 05 mysql_query("set names utf8"); 06 }else{ 07 exit("创建数据库失败"); 08 }; 09 if(!mysql_select_db($mysql_dbname)){ 10 exit("找不到数据库:".$mysql_dbname."); 11 }; |
mysql_query("set names 字符编码"),支持中文字符编码可以是utf8、gbk和gb2312。
以下是要插入到数据表`wb_node`的数据。
代码如下 | |
02 "INSERT INTO ` wb_node` VALUES ('2', 'news', '文章管理', '0', '1', '文章管理', '1', '1', '2');"; 03 "INSERT INTO ` wb_node` VALUES ('3', 'index', '首页管理', '0', '1', '首页模块', '1', '1', '2');"; 04 "INSERT INTO ` wb_node` VALUES ('4', 'picture', '图片管理', '0', '1', '图片管理', '1', '1', '2');"; 05 "INSERT INTO ` wb_node` VALUES ('5', 'download', '下载管理', '0', '1', '下载管理', '1', '1', '2');"; 06 "INSERT INTO ` wb_node` VALUES ('6', 'page', '单页管理', '0', '1', '单页管理', '1', '1', '2');"; 07 "INSERT INTO ` wb_node` VALUES ('7', 'columns', '栏目管理', '0', '1', '栏目管理', '1', '1', '2');"; 08 "INSERT INTO ` wb_node` VALUES ('8', 'databakup', '数据备份', '0', '1', '数据备份', '1', '1', '2');"; 09 "INSERT INTO ` wb_node` VALUES ('9', 'role', '角色管理', '0', '1', '角色管理', '1', '1', '2');"; 10 "INSERT INTO ` wb_node` VALUES ('10', 'config', '配置管理', '0', '1', '配置管理', '1', '1', '3');"; 11 "INSERT INTO ` wb_node` VALUES ('11', 'blog', '博客管理', '0', '1', '博客管理', '1', '1', '2');"; 12 "INSERT INTO ` wb_node` VALUES ('12', 'user', '用户管理', '0', '1', '用户管理', '1', '1', '2');"; 13 "INSERT INTO ` wb_node` VALUES ('13', 'guestbook', '留言管理', '0', '1', '留言管理', '1', '1', '2');"; 14 "INSERT INTO ` wb_node` VALUES ('14', 'link', '友情链接管理', '0', '1', '友情链接管理', '1', '1', '2');"; 15 "INSERT INTO ` wb_node` VALUES ('15', 'comment', '评论管理', '0', '1', '评论管理', '1', '1', '2');"; 16 "INSERT INTO ` wb_node` VALUES ('16', 'upload', '附件管理', '0', '1', '附件管理', '1', '1', '2');"; 17 "INSERT INTO ` wb_node` VALUES ('17', 'announce', '公告管理', '0', '1', '公告管理', '1', '1', '2');"; 18 "INSERT INTO ` wb_node` VALUES ('18', 'banner', '广告管理', '0', '1', '广告管理', '1', '1', '2');"; 19 "INSERT INTO ` wb_node` VALUES ('19', 'index', '友情列表', '1', '1', '友情列表', '1', '14', '3');"; |
好了,测试的准备工作已经做好了。待继...
一、保持下面条件1、2不变,只改变条件(3)的编码
1、数据表的字符集:CHARSET=utf8
2、php文件编码:gb2312
3、mysql_query("set names 字符编码")
3.1、mysql_query("set names gbk");显示乱码如图(1)
图(1)
3.2、mysql_query("set names gb2312");显示乱码如图(1)
3.3、mysql_query("set names utf8");显示正常如图(2):
图(2):
3.4 不执行mysql_query("set names 字符编码")语句,显示乱码如图(3)
图(3):
从第一轮的测试结果可以知道,数据表的字符集设置为CHARSET=utf8,并且使用的PHP文件的编码为gb2312,这时为了避免中文乱码,在存入数据前记得执行mysql_query("set names utf8")语句。
二、保持下面条件1、2不变,只改变条件(3)的编码
1、数据表的字符集:CHARSET=utf8
2、php文件编码:utf-8
3、mysql_query("set names 字符编码")
3.1、mysql_query("set names gbk");显示乱码如图(1)
3.2、mysql_query("set names gb2312");显示乱码如图(4)
图(4):
3.3、mysql_query("set names utf8");显示正常如图(2)
3.4 不执行mysql_query("set names 字符编码")语句,显示乱码图(3)
第二轮测试和第一轮不同之处就是把PHP文件的编码改为utf-8,测试结果和前面相同。似乎PHP文件的编码不会影响中文乱码,当然这只是初步结果,后面还继续。
三、保持下面条件1、2不变,只改变条件(3)的编码
1、数据表的字符集:CHARSET=gbk
2、php文件编码:gb2312
3、mysql_query("set names 字符编码")
3.1、mysql_query("set names gbk");显示乱码如图(1)
3.2、mysql_query("set names gb2312");显示乱码图(3)
3.3、mysql_query("set names utf8");中文正常显示如图(2)
3.4 不执行mysql_query("set names 字符编码")语句,显示乱码如图(5)
图(5)
第三轮字符集编码和PHP文件编码都改了,对比前两轮,可知,在存入数据前执行mysql_query("set names utf8"),中文总是正常显示,PHP文件编码对乱码好像真的没有影响。