萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> Mysql數據庫中文亂碼解決方法總結

Mysql數據庫中文亂碼解決方法總結

在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`的數據。

 代碼如下 復制代碼


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文件編碼對亂碼好像真的沒有影響。

copyright © 萬盛學電腦網 all rights reserved