背景:公司由於某種歷史原因,導致數據庫中新導入的數據與原有字符集不匹配,導入數據后,查詢出現亂碼,無法正常顯示數據信息。
解決方法:導出原有數據庫的數據信息,修改字符集后重新導入回去。前提條件是目標字符集需要大於或者等於已有字符集,否則導入失敗。
操作過程如下:
===========================================
mysql> show create database HA; #查詢HA庫創建時的默認字符集信息
mysqldump -uroot -p --default-character-set=latin1 -d HA > hatable.sql #導出HA庫的表結構,按照原有默認字符集導出,否則導出數據可能出錯
musqldump -uroot -p --defalult-character-set=latin1 --no-create-info HA > hadata.sql #導出HA庫的數據,no-create-info表示不要create table語句
使用sed命令或者vim編輯器將hatable.sql和hadata.sql中的latin1批量修改為uft8即可。
mysql> create database new default charset utf8; #創建新的數據庫,用於數據導入
mysql> create database old default character set latin1;
myqldump -uroot -p new < hatable.sql #導入表結構
mysqldump -uroot -p new < hadata.sql #導入數據
數據導出
# 只導表結構 echo 'SET FOREIGN_KEY_CHECKS=0;' > mdb_tables.sql; mysqldump -h127.0.0.1 -uuser -puser -d --add-drop-table=FALSE DBname >> mdb_tables.sql # 只導數據庫存儲過程和函數 echo 'SET FOREIGN_KEY_CHECKS=0;' > mdb_cunchu.sql; mysqldump -h127.0.0.1 -uuser -puser -ntd -R DBname >> mdb_cunchu.sql # 只導表數據 echo 'SET FOREIGN_KEY_CHECKS=0;' > mdb_data.sql; mysqldump -h127.0.0.1 -uuser -puser --no-create-info --complete-insert --skip-tz-utc DBname >> mdb_data.sql
注意:選擇目標字符集時,要注意最好大於等於原字符集(字庫更大),否則可能會丟失不被支持的數據
mysql> show database new;
mysql>use new;
mysql>show tables;
mysql>select * from tables; #驗證數據信息是否還是亂碼,正常顯示,則表示成功。