以前的經驗,寫下來以免忘記。
之前朋友的一個資料庫 BIG5 要我幫忙轉成 utf-8 的編碼。發現:
於是我仔細研究他的資料庫,以及他的程式的存取方法,發現是這樣的:
show variables like 'character%';
資料庫校對:utf8_bin
資料庫連線:latin1
character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8
資料庫內容:big5
這意思是不是說?
存放在 utf8 編碼的資料庫中的 big5 編碼字元,但是要用latin1 的編碼連線取出。
不,我後來又想了想,猜測應該是:
big5的字元(中文字2字元)用latin1的字元集(character set)來保存,所以取時,也用同樣的字元集來取出。至於資料庫校對(utf8)和取出連線沒有關係。
如果我沒有指定字元集,就會用預設的(可能是utf8)來取出資料庫中的資料,那可能會把字元組合切得亂七八糟(例如原本二個字元組一個big5中文字,在latin1中拆成一個一個獨立字元,結果用utf8的規則取出來,可能三個字元取出當一個中文字。
做了很多失敗的嘗試,後來才想到,那取出時就一定要先指字編碼的方式,才會是正常的結果。
所以我改下指令來 dump 時,把預設的 charset 寫入。
$ mysqldump --default-character-set=latin1 -u root -p -B DB1 > DB1_in_big5.sql
然後再 iconv
$ piconv -f big5 -t utf8 DB1_in_big5.sql> DB1_in_utf8.sql
最後再餵回去,成功。
這樣,我就順利的把資料庫 BIG5 全部轉成 utf-8 的編碼再餵回去。
原文 2010-04-24 17:46:55