mysql字符集續2

        MySQL自4.1版本推出之後爲我們國人帶來的亂碼問題也隨之風彌整個互聯網。主要原因就是不同字符集編碼不同而產生的。
        
        先說一下MySQl的配置中都有哪幾種字符集:

MySQL 4.1的字符集支持(Character Set Support)有兩個方面字符集(Character set)和排序方式(Collation)。對於字符集的支持細化到四個層次: 服務器(server),數據庫(database),數據表(table)和連接(connection)。

我們可以用下面命令檢查MySQL當前字符集信息:

show variables like “character_set_%”;
show variables like “collation_%”;

        MySQL4.1或以上版本的系統預設的編碼是UTF-8,而我們的中文編碼爲:GBK,GB2312,BIG5……所以當我們把中文被當做別的字符集轉化爲UTF-8的字符集,再存入數據庫時就會出現部分文字代碼丟失而產生亂碼。這就是我們查詢數據庫得到這些數據顯示到網頁上的就是“????”或亂碼的原因。

        解決辦法嗎?當然也很簡單,網頁上隨便一搜就能搜到。

解決辦法(1)就是在插入數據之前先設置一下MySQL的字符集,即:mysql_query(“set names gbk”) 或是將gbk改爲gb2312 或是別的中文字符集。然後再執行插入操作。

《特》《別》《聲》《明》

        上面的辦法在我電腦上測試成功。

但我多少感覺有些不舒服,每次查詢前都要寫mysql_query(‘set name gbk’);。這一點我挺不滿意的。於是我又開始搜索,結果我找到了下面將要講到的配置方法

        解決辦法(2):配置my.ini文件。打開my.ini 找到 [mysql] 找到default-character-set 如果你的mysql是默認安裝的話這裏應該是:utf8。這時將它改爲:gbk或是gb2312就行了。(  即不在查詢前加入mysql_query(“set names gbk”)  )

《又》《出》《問》《題》《了》

        我照上面的方法改了不知多少次,從gbk改到gb2312又改到utf8始終沒能成功。我想了想,既然網頁傳值不能成功那麼在命提示符下是什麼樣子的呢。
        
        於是我用命令提示符打開了MySQL。測試發現在命令提示符下操作MySQL一切正常。弄到這裏我的頭都大了。
        
        我又重新配置了一下PHP環境,下載的最新AppServ 2.5.9。檢查一下MySQL字符集,默認字符集是UTF8。

MySQL命令:(show variables like “character_set_%”;)
        
        然後我在不執行(mysql_query(“set names gbk”))時向數據庫執行插入,查詢操作,在網頁上一切都顯示正常。呵呵,真是怪了!

爲什麼中文字卻能不加轉換的插入到數據庫中?
又爲什麼中文字能不加轉換的從數據庫中得到正確數據?

帶着這兩個問題我又打開命令提示符。執行查詢操作,結果顯示的全是亂碼(當時我想的是:文字應該爲GBK編碼)。於是我又執行:set names gbk; 把這個數據庫字符集改爲GBK字符集。再執行查詢結果顯示的全部是問號。這到底是怎麼回事,我真的不想再研究了。

        我一氣之下把my.ini文件的[mysql]欄的default-character-set 註釋掉了。重啓MySQL後,又執行了一下操作,結果真是大出意料呀,居然正常顯示了。我興奮的不的了。結果我又查詢了一下當前mysql的字符集:呵呵居然是latin1。難道是這裏在做怪?然後我用PHP插入數據,查詢數據庫(不執行 mysql_query(“set names gbk”)),結果照樣顯示正常。哈哈,問題終於找到了,原來真是這裏在做怪!!!

我想看到這裏大家已經應該明白了,下面我做一個小總結吧。

《最》《後》《總》《結》(只是個人見解,不負任何法律責任哦!)

(1)        在mysql5.0.45環境下,數據庫把由PHP傳遞的數據默認爲latin1 (ISO-8859-1) 字符集來處理。即把latin1轉換爲UTF-8,然後插入。
(2)        當PHP向MySQL數據庫中插入數據前執行(mysql_query(“set names gbk”))MySQL纔會以PHP查詢中指定的字符集(gbk)轉換爲UTF-8後插入。
(3)        CMD模式下操作MySQL,和用PHP操作在字符集處理上是兩種概念。CMD下操作MySQL,MySQL會把CMD下的數據默認爲MySQL默認的字符集轉換爲UTF-8後處理。而處理PHP數據MySQL會默認爲 latin1 數據做處理。




《《《----我最後的配置----》》》:

因爲我只是在本地作測試,爲了測試時少寫一行mysql_query(“set names gbk”)。所以我把 my.ini 的 [ mysql ] 欄default-characte_set 改爲 latin1。這樣無論自己在本地測試或是CMD下操作MySQL都很方便。但是如果你用的是PHPMyAdmin的話,可能會顯示亂碼,解決辦法就是安裝一個支持字符集爲 latin1的PHPMyAdmin。字符集和字符集校對都爲 latin1 ,就能正常顯示了。

        《關》《於》《數》《據》《庫》《備》《份》

                        因爲mysql4.1之前採用的中文字符集爲 gbk 或 gb2312。建議備份和恢復數據庫前先執行 set name gbk ;命令即可解決亂碼問題。




好了,寫完了,這是我對MySQL字符集的一點見解。若有不對之處還望指證。88了先,休息一會……



                By:dx_andy
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章