按照下面做法,終于成功了!慶祝,紀(jì)念......
背景:某個系統(tǒng)的mysql數(shù)據(jù)庫dnname采用默認(rèn)的latin1字符集,系統(tǒng)升級需要將所有數(shù)據(jù)轉(zhuǎn)換成utf-8格式,目標(biāo)數(shù)據(jù)庫為newdbname(建庫時使用utf8)
方法一:
步驟一 命令行執(zhí)行:mysqldump --opt -hlocalhost -uroot -p*** --default-character-set=lantin1 dbname > /usr/local/dbname.sql
步驟二 將 dbname.sql文件中的create table語句的CHARSET=latin1改為CHARSET=utf8
步驟三 在dbname.sql文件中的insert語句之前加一條'set names utf8;'
步驟四 將dbname.sql轉(zhuǎn)碼為utf-8格式,建議使用UltraEditor,可以直接使用該編輯器的'轉(zhuǎn)換->ASCII到UTF-8(Unicode編輯)',或者將文件另存為UTF-8(無BOM)格式
步驟五 命令行執(zhí)行:mysql -hlocalhost -uroot -p*** --default-character-set=utf8 new_dbname < /usr/local/dbname.sql
總結(jié):這種方法有個致命之處就是當(dāng)數(shù)據(jù)中有大量中文字符和其他特殊符號字符時,很有可能導(dǎo)致在[步驟五]時報錯導(dǎo)致無法正常導(dǎo)入數(shù)據(jù),如果數(shù)據(jù)庫比較大可以分別對每張表執(zhí)行上述步驟
方法二(推薦大家使用):
為了解決第一種方法中總結(jié)時說到的問題,在網(wǎng)上苦苦查找了一天資料才東拼西湊的搞出一個比較穩(wěn)妥的解決方法
步驟一 將待導(dǎo)出的數(shù)據(jù)表的表結(jié)構(gòu)導(dǎo)出(可以用Phpmyadmin、mysqldump等,很簡單就不說了),然后將導(dǎo)出的create table語句的CHARSET=latin1改為CHARSET=utf8,在目標(biāo)庫newdbname中執(zhí)行該create table語句把表結(jié)構(gòu)建好,接下來開始導(dǎo)出-導(dǎo)入數(shù)據(jù)。命令:

步驟二 命令行:進(jìn)入mysql命令行下,mysql -hlocalhost -uroot -p*** dbname
步驟三 執(zhí)行SQL select * from tbname into outfile '/usr/local/tbname.sql';
步驟四 將tbname.sql轉(zhuǎn)碼為utf-8格式,建議使用UltraEditor,可以直接使用該編輯器的'轉(zhuǎn)換->ASCII到UTF-8(Unicode編輯)',或者將文件另存為UTF-8(無BOM)格式
步驟五 在mysql命令行下執(zhí)行語句 set character_set_database=utf8; 注:設(shè)置mysql的環(huán)境變量,這樣mysql在下一步讀取sql文件時將以utf8的形式去解釋該文件內(nèi)容
步驟六 在mysql命令行下執(zhí)行語句 load data infile 'tbname.sql' into table newdbname.tbname;
注意:千萬不要忘了第四步
采用第二種方法,所有數(shù)據(jù)均正常導(dǎo)入,且格式轉(zhuǎn)換成功沒有亂碼。
參考:http://blog.csdn.net/guoguo1980/archive/2008/01/28/2070701.aspx
--------------------
WE準(zhǔn)高手