幫朋友的論壇做了一次編碼轉換的工作。 系統是windows 2003,mysql4.1 discuz 5
本來以為很簡單,dump數據
mysqldump -u root -p –opt –default-character-set=latin1 \
–skip-set-charset olddb cdb_members > d:\bak\cdb_members.sql
出來,用工具轉一下編碼,然後再導入
mysql -u root -p –default-character-set=utf8 newdb < d:\bak\cdb_members.sql
實際操作並沒有想像的那麼簡單,最後解決的方案,也不是那麼複雜。
先說一下教訓,建立數據庫的時候,同一個應用,所有的編碼一定要一致 ,不然就是自尋煩惱,現在跟你說,你肯定說不好,但是有時候就是不注意。 要遷移的這個論壇就有兩種編碼gbk和latin1,目標是遷移到utf8,裡面gbk的雙字節數據全部是亂碼,嘗試改編碼也讀不出數據了,由於不是重要數據,後來就放棄轉碼了,據說原來就有亂碼的問題。
裡面還遇到一個問題就是老的數據是更改過的,目標db是全新安裝的,表結構不一致,好在新系統是老系統的子集,那麼我就以老表為參照物,來改新db的表結構。
導出用了mysqldump,這裡要提的是–default-character-set,後邊要跟數據表的編碼,不然導出的數據可能會亂碼。
問題出在import,轉編碼後import,怎麼也不成功,說什麼mysql數據庫gone away或者說duplicate,突然又一次成功,一看是因為建表語句的編碼設置沒有修改成utf8。
轉編碼用的ultraedit的轉換功能,後來懷疑ultraedit的轉換出錯,網上找了一個win版本的iconv裝上
iconv -f ISO-8859-1 -t UTF-8 original.txt> newfile.txt
問題依舊.其中有幾個小表,直接用導出的sql粘貼到phpmyadmin裡運行就可以了,但是會員和帖子表肯定不能用這個辦法。
還試用了把latin1的表修改字符,然後試圖用convert轉碼
update cdb_members set username=CONVERT(username USING utf8),也沒成功後來當我一籌莫展準備繳械的時候,想起了另外兩個功能
SELECT INTO OUTFILE
和
LOAD DATA INFILE
是另外一種導入導出的方法。 貼出使用的sq
SELECT
uid,
nickname,
site,
alipay,
icq,
qq,
yahoo,
msn,
taobao,
location,
customstatus,
medals,
avatar,
avatarwidth,
avatarheight,
bio,
signature,
sightml,
ignorepm,
groupterms,
authstr INTO OUTFILE 'd:/cdb_memberfields.txt'
FIELDS TERMINATED BY “,”
OPTIONALLY ENCLOSED BY “”"”
LINES TERMINATED BY “\r\n”
FROM gench2.cdb_memberfields;
然後轉換'd:/cdb_memberfields.txt' 的編碼為utf8,可以用ultraedit或者iconv,然後load到新數據庫的表
LOAD DATA INFILE 'd:/cdb_memberfields.txt' INTO TABLE cdb_memberfields
FIELDS TERMINATED BY “,”
OPTIONALLY ENCLOSED BY “”"”
LINES TERMINATED BY “\r\n”;
上面還有一個問題是TERMINATED,ENCLOSED的選取,如果選的不對,會load失敗。
附1:共遷移瞭如下表
cdb_attachments
cdb_forums
cdb_memberfields
cdb_members
cdb_onlinetime
cdb_posts
cdb_threads
附2:google到的鏈接
http://gentoo-wiki.com/TIP_Convert_latin1_to_UTF-8_in_MySQL
Popularity: 31%







1樓的配置在mysql設置編碼預言。 mysql的默認Latin1
好東西,正需要
你是怎麼做的? 導出成sql文件,亂麼?
我的WP的數據庫就是Latin1的,現在想轉成UTF8的,總是亂碼,不知哪步有問題……