如何修正 MySQL 資料庫的 encoding?
最近 gslin 的 blog 因為 MySQL 資料庫的 encoding 問題,發生異常現象,只好從零開始。無獨有偶地,Pesty 最近也處理了 MySQL 使用 UTF-8 的相關問題。
這些問題之所以會發生,是因為越來越多的 web application 套件使用 UTF-8 儲存資料,但大家在設定 MySQL 時卻都沒有注意到這點,仍然使用預設的 latin1 作為資料庫的 encoding。Web application 餵入 UTF-8 資料,MySQL 卻當作 latin1 在讀,雖然 web application 讀回來的時候,因為剛好是反向處理,資料看似沒有任何異常,但實際上 collation 是錯的,當進行移機、備份甚至轉換 web application 時,也都會發生問題。
我一年多前也有遇到類似的問題,原本在公司有個用 phpBB2 架的 forum,採用 big5 編碼,但實際上 mysql-3.23 裡是用 latin1 存。想要轉換成 UTF-8,移機到 FreeBSD 5 上改用 mysql-4.1,就發生問題了。我那時沒有解決,所以 phpBB2 移機計畫暫緩了一年多,但實在是多跑一個 virtual machine 只為了這個移不過來的 phpBB2,實在浪費記憶體。剛好看到 gslin 與 pesty 最近也在弄這個問題,就重新試了一遍步驟如下:
- 用 mysqldump 自 mysql-3.23 倒出來,發現必須加上
--default-character-set=latin1的參數,才能正確倒出實際上是用 big5 的 phpBB2 的資料庫。 - 用
iconv -c -f CP950 -t UTF-8將倒出來的 SQL 轉成 UTF-8。必須要加-c,否則會死在半路。換句話說,其實中間已經有東西爛掉了。 - 進 mysql 用
SET GLOBAL/SESSION character_set_XXX=utf8調整 system variables,將 charset 與 collation 通通改成 UTF-8,然後做CREATE DATABASE phpbb2。 - 再用
SOURCE指令把剛剛用 iconv 轉出來的 SQL 檔倒回來。
結果在第四個步驟裡,mysql (client) 就 core dump 了。猜測有可能是第二步用 -c 硬轉時,把某個指令搞爛了。不過 mysql (client) 是直接 core dump 而不是跑 error message 出來指出錯誤何在,所以這下難辦了,只能靠 iconv 不加 -c 想辦法慢慢抓問題。



One Comment
我會建議, 用select into file 後, 配 iconv 轉完, 再用 load file from 把東西倒回去. 目的是把資料跟sql statement分離, 這樣可以避免壞的資料導致整個import毀掉.大概在MySQL 4剛出的時候, 我用了很多方式去實驗/驗證/嘗試一些轉換的方式, 雖然當時真正的目的是在做兩個DBMS之間的auto feeder, 但是由於要把資料用各種charset塞進去然後實驗, 所以 latin1/big5/utf-8 的大多數鳥蛋問題都解的差不多了.btw, 在大陸看過一個Perl Script配合 Locale module可以很完美的轉過去, 詳細link我現在找不到了, 也許可以提供給大家另外一邊的想法.
6 Backlinks
10.3. Specifying Character Sets and Collations 5.2.2. Server System Variables set和show语法之一 MySQL - Chinese Language Processing and Chinese Computing MySQL 5 使用 UTF-8 配合 WordPress 的問題 - 月夜火 *如何修正 MySQL 資料庫的 encoding? [encoding] MySQL 4.1.x SET NAMES UTF8 wordpress 1.5升級注意事項 - 中文亂碼篇 mysql 4.1中文亂碼第二擊 【保証成功】的 mysql 中文亂碼解決方案 solaris上开发J2EE应用中文问题的解决
10.3. Specifying Character Sets and Collations 5.2.2. Server System Variables set和show语法之一 MySQL - Chinese Language Processing and Chinese Computing MySQL 5 使用 UTF-8 配合 WordPress 的問題 - 月夜火 *如何修正 MySQL 資料庫的 encoding? [encoding] MySQL 4.1.x SET NAMES UTF8 wordpress 1.5升級注意事項 - 中文亂碼篇 mysql 4.1中文亂碼第二擊 【保証成功】的 mysql 中文亂碼解決方案 solaris上开发J2EE应用
PHP5 的支援度尚未完滿... =__=||| 所以「轉移尚未成功,兄弟仍須努力」啦 ~ 參考資料:MySQL 升級 5.0 與 UTF-8 之相關解決方法MySQL 4.1.x 記得要加在 my.cnf 的東西如何修正 MySQL 資料庫的 encoding?A MySQL 4.1 Story
3.x 搬移到mysql 5.0。 在依照前文,把資料dump、處理之後,在步驟五之前,使用指令:iconv -c -f CP950 -t UTF-8 -o [output file] [input file] 把資料轉移成utf8編碼。(參考:如何修正MySQL資料庫的encoding?) 另外,您一定會在dump出來的檔案裡面看到類似:/*!40101 SET NAMES utf8 */之類的資料,相信我,這絕對不是註解...拿掉他吧。參考msyqldump(v
3.x 搬移到mysql 5.0。 在依照前文,把資料dump、處理之後,在步驟五之前,使用指令:iconv -c -f CP950 -t UTF-8 -o [output file] [input file] 把資料轉移成utf8編碼。(參考:如何修正MySQL資料庫的encoding?) 另外,您一定會在dump出來的檔案裡面看到類似:/*!40101 SET NAMES utf8 */之類的資料,相信我,這絕對不是註解...拿掉他吧。參考msyqldump(v
[encoding] MySQL 4.1.x SET NAMES UTF8
先看看這個,裡面提到重要的一點,有 SUPER 權限的 user 在連線的時候不會去執行 init_connect 。這好像說明了很多人為什麼都要在連線後自己加上 'SET NAMES UTF8′ 了。
根據實驗結果,如果
Post a Comment