最近還在不斷完善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`的數據。
01 "INSERT INTO ` wb_node` VALUES ('1', 'admin', '後台項目', '0', '1', '後台項目', '1', '0', '1');";
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文件編碼對亂碼好像真的沒有影響。