自從Mysql升上4.1版之後,由於編碼的改變,導致原有以編碼Big 5撰寫的程式面臨大的困難,不僅要修改程式,也要修改Mysql的編碼,以求原來的程式得以順利執行。

  但我並不是要寫這個問題。

  在此指的「編碼」問題,是以我用Mysql 5.0版為主開發程式所遇到的情況,跟一般以原本Mysql即要進行轉碼的情形是不同的;轉換程式與Mysql相信在Google上會有好心的人家告知需要的人如何成功變更,假若目前的你不幸的也遇上此問題,以下的兩個網址希望能幫助的到你──

 

  http://forum.slime.com.tw/thread196333.html

  http://forum.slime.com.tw/thread208451.html

 

 

  針對我所遇到的問題,我也不免俗的拜請了一下孤狗大神,但是好像沒有相關的問題討論(還是我笨手笨腳,所以沒找到?),所以我將我所測試的結果整理上來,倘若有人與我的情況相同的話,或許此篇報告可以幫到你(笑)。順便講一下,我遇到的問題用上頭兩個網址的方法一樣無法解決,所以還是認命一點,再找其他的解決方式吧(淚)。

 

  P.S.以上皆為在Linux主機上遇到的問題測試,至於在Windows作業系統裡發生的問題為何,我並不知道,請勿以此測試結果套用至Windows作業系統上。

 

 

 

  測試機台:Linux Fedora Core 6

       Apache 2.2

       Mysql 5.0

       PHP 5.1.6

 

  呈現機台:Windows XP SP2

       IE 6.0

       Dreamweaver CS3

          記事本

 

  測試檔案:info.html(輸入資料表單)、insert.php(寫入mysql)、update.php(修改資料)

  以下測試以:「一步天履」四字為例。

  另,Linux的文字模式底下,一定要開啟中文化程式「zhcon」觀看。

 

  P.S.我酷愛布袋戲,當我寫完程式時一定會拿布布的人物名字來練刀,此回當然不例外,馬上拿霹靂三巨頭「葉大俠、素大餅、暴力和尚」來練刀,果不其然──「暴力和尚」不愧為霹靂當家第一大天王,其餘兩人都沒問題,就一頁書的一直有問題……= =+(恨)

為免我吐血吐不完,我決定選擇邪影這個殺傷力較小的名字來測試,以免重傷倒在小企鵝面前,這樣小企鵝一定又會爬到我頭上來,不日便會當機死給偶看……(囧)


以下為測試的結果:





  以上為測試的結果,因此歸納出下列幾點:

 

l            由於在Linux上寫的網頁格式無法辨識,故捨棄,以在Windows上寫的網頁繼續再作測試。

l            「ApacheMysql、網頁宣告」三者的編碼缺一不可,必須為相同的編碼,否則Apache必須宣告成「Big 5」,才能呈現想要的結果。

l            進行資料庫轉換完畢(轉換成utf-8格式),使用a來進行寫入資料的動作,將Apache宣告為「UTF-8」,某些文字輸入仍有問題,故仍捨棄a網頁,利用b網頁來進行寫入資料的動作。

l            b網頁執行後的結果如同a網頁執行的結果,但是資料庫裡的中文無論是在文字模式底下或在x window底下皆呈現亂碼,但呼叫卻OK!不過之前寫入的資料卻通通變成亂碼,神奇的是,呼叫竟也OK?!原因應是出於之前寫入資料時並未設定以何種編碼寫入,全賴mysql自行判定以何種編碼做為轉換;而現在無論之前以何種編碼模式寫入通通一律以「UTF-8」作輸出,因此又會遇上相同的轉碼問題,但將資料庫的設定檔恢復成預設值的話,一切又恢復原狀。

l            不以b網頁進行test,直接在Windows平台上新增網頁資料,檔名「utf8test.html」(內容與info.html相同),並將網頁宣告成「UTF-8」,儲存檔案時以「utf-8」的格式儲存,以達到「ApacheMysql、網頁、php」皆以「UTF-8」寫入,執行的結果呼叫是OK;但是假如將my.cnf改回預設值,並將網頁宣告成Big 5的話,那麼執行的結果將會回復到原狀(請看表格測試結果),必須將Apache宣告為Big 5,如此,資料庫寫入與呼叫才會都OK

 

 

  以下為最後結論:

 

l            此處所談的編碼問題,非指「程式」在網頁上呈現亂碼的問題,而是當資料寫入Mysql時,Mysql產生的亂碼問題,ex.一步天履、一步蓮華、暴力和尚。
以「一步天履」為例(其餘二個也是同樣的情形):
  「履」:OK
  「天履」:
OK
  「步天履」:
OK
  「一步天履」:
NO
  也就是說,當四個字分開輸入時,資料顯示皆為正常,但當四個字連在一起輸入Mysql時,即會產生最後一個字為亂碼的現象(在x window上),導致搜尋資料時呈現的結果為「查無資料」;而在文字模式底下,Mysql都會呈現亂碼(此指Mysql改成character-set=utf8而言),此部份應該是要利用程式來補足,如同之前的版本遇到「成功」兩個字時會變為亂碼的意思一樣(找到可以解決的程式時再上來補充)。

l            最重要的結論!!只要能在Linux的文字模式底下呈現中文的話,資料的呼叫絕對沒問題,假若不是,那資料……神明有保佑時就有,神明如果沒空,那資料可能就──

 

  結果,你以為苦命的測試就到此結束了嗎?

  不。

  長夜漫漫,輾轉難眠,腦中思慮不停打轉,全是繫在mysql編碼這癥結點上,雖是閤上了眼,卻又心有不甘,誓為找出原因才肯休止。

  突地,腦中靈光一閃,何不將資料型態改變,增設為「varchar 14)」,或許會有不同的結果。

 

  結果──

 

 

 

  就成了!

 

 

 

  媽的!

  老子犧牲假期測試的結果,竟然就是──測試的結果,竟然就是──測試的結果,竟然就是──

 

 

  我是抓狂暴走線分隔我是抓狂暴走線分隔我是抓狂暴走線分隔我是抓狂暴走線分隔

 

  為何會有如此的差異?

  請看這個網址論述「UTF-8」格式為何?
  http://www.utf.com.cn/article/s41-2

 

  由此可知,UTF-8的格式不再是以2bytes為分類,所以中文的一個字元也不會那麼恰巧等於2byte,有可能會往上增加,因此,中文若是要到四個字元的話,則程式的資料型態設定可能須至10個位元,否則寫入的資料將會以亂碼呈現;若是五個字元呢?經測試,可能要到16個位元才能寫入,或許不需要那麼高也說不一定(就算my.cnf未宣告為『utf8』也可成立,這是我以a網頁執行的結果)。

 

  但可以確定的是:

l          只要能在Linux的文字模式底下呈現中文的話,資料的呼叫絕對沒問題(請看測試結果)!

l          Apache與網頁的編碼同時宣告為「Big 5」,則寫入的資料也會沒問題(以原有的b網頁執行後的結果)。

l          但若Apache與網頁的編碼同時宣告為「UTF-8」(即是以b網頁執行),那麼網頁的存檔方式一定要為「UTF-8」,如此,寫入mysql才不會有錯誤發生。

 

 

 

  舞 書於2008/3/30 補充於2008/3/31

 

 



arrow
arrow
    全站熱搜

    舞暉羅 發表在 痞客邦 留言(0) 人氣()