轉載自
http://bluecat.csie.net/2007/12/17/2498/
老問題,不過一直懶得弄,都用懶人法先撐著。
懶人設定法,在 connect 後呼叫
SET NAMES ‘latin1′
如果要根本上治好,或是說連資料庫內的資料都正確的轉成 utf8 ,那就得作點苦工了。首先 MySQL 的 Character Set 變數有三
character_set_client client 傳給 server 使用的 charset ,即輸入
character_set_results server 傳給 client 使用的 charset ,即輸出
character_set_connection db 實際上存放時的 charset ,通常用 utf8
正常自動設定的話,character_set_connection 會是建立 db 時選擇的 charset,如果 table 或 field 有特別指定不同的 charset ,那麼就以指定的為準,不過這部份是 MySQL 自動轉換,所以不需要管,重點在於輸入與輸出的 charset 必須正確,才能正確的轉換。可以當成語言翻譯,首先必須指出自己使用的語言,伺服器就能正確的翻譯並紀錄成指定的語言,然後指出需要的語言,如此伺服器就能從紀錄翻譯出需要的語言。
懶人設定法就是不管是啥,一概都不轉碼,因為 SET NAMES ‘x’ 等同於
SET character_set_client = ‘x’
SET character_set_results =’x’
SET character_set_connection = ‘x’
也就是告訴資料庫設定傳進去的是 latin1 編碼,並且存成 latin1 編碼,跟存 raw byte data 很像,因此雖然 Database Charset 設成 UTF-8 ,但實際卻還是用 latin1 在處理資料;用 phpMyAdmin 的時,因為網頁編碼是 UTF-8,character_set_client & character_set_results 就會被設成 UTF-8,這時候,懶人設定法的資料就全部都會變亂碼, 因為 UTF-8 的編碼被當作 latin1 ,而這時又要求輸出 UTF-8,於是把原本就是 UTF-8 的資料又做了一次 latin1 -> UTF-8 轉換,會變亂碼也不奇怪了。如果是用 phpMyAdmin 插入資料,雖然 character_set_client 是 UTF-8 做了一次 UTF-8 -> latin1 轉換,但輸出時,因 character_set_results 也是 UTF-8,所以做了 latin1 -> UTF-8 的反轉換,因此得到原本的正常字串。
根本的 UTF-8 修正方式就是先用 latin1 編碼倒出資料,然後依據原始編碼轉碼成 UTF-8 後再倒回去,比較省事的方法是用 mysqldump 抓下來,然後用 vim 轉碼後在倒回去。
之前有個網頁是 Big5 ,就用 php 一筆筆拉出來,然後 mb_convert_encoding 成 UTF-8 ,再存回去,當然 Database 本身的 charset 已經設成 UTF-8 ,需要注意的是 field 的校對也要先設成 utf8_general_ci ,因為要順便作點處理,所以才用 php 做,不然用 mysqldump 應該比較快。
實例
資料庫是 UTF-8 編碼,可是資料都是 Big5 ,並用懶人設定寫入資料庫,現在要把資料庫內的資料從偽 UTF-8 轉成正確的資料以在 phpMyAdmin 中也正常顯示
connet 後,呼叫
mysql_query("SET NAMES utf8"); // 設定輸出為 utf8
mysql_query( "SET character_set_results = ‘latin1′"); // 但吐資料請給我 latin1 (即 Big5 的資料)
接著一筆筆拉出來,用 mb_convert_encoding 從 Big5 轉成 UTF-8 再存回去。
或是
connet 後,呼叫
mysql_query( "SET character_set_client = ‘big5′"); // 設定輸出為 big5
mysql_query( "SET character_set_results = ‘latin1′"); // 但吐資料請給我 latin1 (即 Big5 的資料)
mysql_query( "SET character_set_connection = ‘utf8′"); // 資料庫是 utf8
接著一筆筆拉出來,再直接存回去就好
2008年3月18日 星期二
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言