2013年9月26日 星期四

資料庫Mysql Latin1 轉成 UTF-8

Mysql Latin1 轉成 UTF-8 的方

1.先透過phpMyAdmin 新增一個utf-8的資料庫,如果可以的話請盡量用 utf8_unicode_ci 而不要用 utf8_general_ci

2.匯出舊資料,把資料庫 dump 出來文字檔
mysqldump -u 使用者名稱 -p 資料庫名稱 > database.sql --default-character-set=latin1
例如 mysqldump -u DBusername -p dorm > /tmp/dorm.sql --default-character-set=latin1 (這行指令的意思是說,我要dump出來dorm的資料庫,把內容存成/tmp下面的dorm.sql 文字檔 )












如果想單純只dump一個TABLE,mysqldump -u xxx -p 資料庫 資料表 > database.sql --default-character-set=latin1

3.利用Winscp將剛剛轉出來的文字檔傳回自己的電腦,如果你習慣在Linux Server 上作業也無訪,我個人是比較習慣在Windows上處理。
使用 emEditor 編輯器,把剛剛產生的文字檔打開,用取代的方式將把CHARSET=latin1 COLLATE=latin1_general_ci,都取代成 CHARSET=utf8 COLLATE=utf8_unicode_ci (若無此行可省略這個動作)
有時候由Big5匯出時,phpMyAdmin 會自動把許功蓋等字加上\,記得用取代的方式把\去掉。

(附註說明:如果在文字檔中的建立表格的語法結構中,若有TYPE=MyISAM的,用取代的方式 移除掉)















4.在文字檔的檔案開頭加入以下3行,
SET NAMES utf8;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;


(如果檔案太大Windows打不開,可以考慮用Linux中的vi指令,使用取代的方法)


(注意重點!該文件檔須另存為UTF-8編碼的文件,否則匯入時還是會出現亂碼!!!











4.剛剛完成的檔案傳到要匯入資料的伺服器上,我是習慣傳到/tmp下面,以後比較好清理。
用指令 mysql -u 使用者帳號 -p 進入mysql,若要匯入的資料庫為parking,則使用use parking 來切換進入parking資料庫中,

最後用匯資料的方式匯入該檔案,

指令為 source 檔案位置 (例如檔案名稱為dorm.sql,放在/tmp下,

所以使用指令 source /tmp/dorm.sql;)





















附註說明:

1.匯入文字檔到mysql時若出現,Got a packet bigger than 'max_allowed_packet' bytes的錯誤訊息,則是因為mysql允許的單次最大輸入容量有上限(預設為1M),可在/etc/mysql.cnf中,加入max_allowed_packet=128Mà看狀況調整,記得mysql要重啟

2. 轉檔過程中如果出現文字破壞了結構,如以下
INSERT INTO leaveformlist VALUES (51282,'','AXXXXXXXX','A3200','B9','有事待辦','楊珮華','2012-02-XX','08:00:00','2012-02-XX','17:00:00',8,'X?,NULL,NULL,'','2012-02-13 09:08:37',NULL,NULL,'0000-00-00 00:00:00','','','','','','','2012','N','Y');

查看原始資料庫中看到的是

可以看到makeby這個欄位的資料內容錯誤,正確應為'XX',但是因為珮這個字造成了資料庫原本文字亂碼,進而造成系統匯入錯誤,此為人工手動處理,建議每個TABLE匯入看看,若出現問題直接文字檔修改

3.轉檔過程中最難處理的就是欄位內容中有逗點符號,這樣轉出來的資料格式就被破壞了,如果你的原始資料中有逗點符號的,請也先行處理
(小技巧:
幾次轉碼下來,發現如果出現亂碼的,通常都是像楊X?,的格式,可以透過編輯器裡面取代的方式把整個文件裡的?,取代為?', 這樣可以縮短人工一行一行找的時間
)

沒有留言:

張貼留言