MySQL 4.1的字符集支持(Character Set Support)有兩個方面字符集(Character set)和排序方式(Collation)。 //標題:MySQL字符集簡單講解(個人總結)
//作者:dx_andy
//時間:2007.8.27 晚
//測試環境:win32 MySQL 5.0.45
//原因:自己的MySQL出現亂碼問題
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 ;命令即可解決亂碼問題。