15、 实战:mysqldump改变字符集,实战,迁移数据(重点)
可以作为故障案例,用于面试
乱码-----字符集的问题
背景:公司业务数据book,由于之前建表没注意字符集的问题,导致之前写入的数据出现乱码。现在要将之前的数据和现在数据的字符集一致,不出现乱码情况,将字符集为latin1已有记录的数据转成utf8,并且已经存在的记录不乱码。
步骤
1:建库及建表的语句导出,sed批量修改为utf8
2:导出之前所有的数据
3:修改mysql服务端和客户端编码为utf8
4:删除原有的库表及数据
5:导入新的建库及建表语句
6:导入之前的数据
15.1、 准备实验环境
1、确保你的数据库默认字符集是utf8
修改/etc/my.cnf配置文件中character-set-server=utf8,重启mysql
[root@cong11 ~]# vim /etc/my.cnf
character-set-server=utf8
[root@cong11 ~]# systemctl restart mysqld
2、准备默认字符集是latin1的表文件
由于我们books表的字符集是utf8,删除book数据库,重新创建book数据库,导入字符集为latin1的sql文件book.sql
上传book<book_latin1.sql文件
[root@cong11 ~]# mysql -uroot -p123456 -e “drop database book;”
[root@cong11 ~]# mysql -uroot -p123456 -e “create database book;”
[root@cong11 ~]# mysql -uroot -p123456 book<book_latin1.sql
查看books表的字符集
[root@cong11 ~]# mysql -uroot -p123456 -e “show create table book.books;”
查看表内容
[root@cong11 ~]# mysql -uroot -p123456 -e “select * from book.books;”
15.1.1、 除了英文和时间,中文都是乱码
15.2、 导出数据表结构
[root@cong11 ~]# mysqldump -uroot -p123456 --default-character-set=latin1 -d book> booktable.sql
15.3、 编辑booktable.sql 将latin1修改成utf8
[root@cong11 ~]# vim booktable.sql
15.4、 确保数据库不再更新,导出所有数据
[root@cong11 ~]# mysqldump -uroot -p123456 --quick --no-create-info --extended-insert --default-character-set=latin1 book>bookdata.sql
参数说明:
–quick:用于转储大的表,强制mysqldump从服务器一次一行的检索数据而不是检索所有行,否则内存压力大,并输出当前cache到内存中
–no-create-info:不要创建create table语句(不导出创建表的语句,因为之前的表默认是latin1字符集)
–extended-insert:使用包括几个values列表的多行insert语法,这样文件更小,IO也小,导入数据时会非常快,(一次插入多行数据的语法)
–default-character-set=latin1:按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码
15.5、 打开bookdata.sql 将SET NAME latin1 修改成SET NAME utf8
[root@cong11 ~]# vim bookdata.sql
15.6、 新建book2库
[root@cong11 ~]# mysql -e “create database book2 default charset utf8;” -uroot -p123456
15.7、 建立表,导入我们之前导出的表结构
[root@cong11 ~]# mysql -uroot -p123456 book2 <booktable.sql
15.8、 导入数据
[root@cong11 ~]# mysql -uroot -p123456 book2 <bookdata.sql
15.9、 查看结果
[root@cong11 ~]# mysql -uroot -p123456 -e"show create table book2.books;"
15.10、 查看表内容
[root@cong11 ~]# mysql -uroot -p123456 -e"select * from book2.books;"