背景:公司由于某种历史原因,导致数据库中新导入的数据与原有字符集不匹配,导入数据后,查询出现乱码,无法正常显示数据信息。
解决方法:导出原有数据库的数据信息,修改字符集后重新导入回去。前提条件是目标字符集需要大于或者等于已有字符集,否则导入失败。
操作过程如下:
===========================================
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; #验证数据信息是否还是乱码,正常显示,则表示成功。