Mysql資料庫中文亂碼解決方案總結

來源:互聯網
上載者:User

最近還在不斷完善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檔案編碼對亂碼好像真的沒有影響。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.