模拟数据库中数据乱码
背景:公司业务数据book,由于之前建表没注意字符集的问题,导致之前写入的数据出现乱码。现在要将之前的数据和现在数据的字符集一致,不出现乱码情况,将字符集为latin1已有记录的数据转成utf8,并且已经存在的记录不乱码。
步骤
1:建库及建表的语句导出,修改为utf8
2:导出之前所有的数据
3:修改mysql服务端和客户端编码为utf8
4:删除原有的库表及数据
5:导入新的建库及建表语句
6:导入之前的数据
操作实验:
1、 首先确保该数据库服务器的默认字符集是utf8
修改/etc/my.cnf配置文件中character-set-sever=utf8,重启MySQL服务
#vim /etc/my.cnf
character-set-server=utf8
重启MySQL服务
2、 在shell命令行将原有的book库删掉
[root@MySQL ~]# mysql -uroot -p123456 -e “drop
database book;”
3、 在shell命令行创建一个book库
[root@MySQL ~]# mysql -uroot -p123456 -e “create
database book;”
4、 将book_latin1.sql表导入book表中模拟数据乱码
[root@MySQL ~]# mysql -uroot -p123456
book<book_latin1.sql
5、 查看books表的字符集默认的并不是utf8字符集
[root@MySQL ~]# mysql -uroot -p123456 -e “show create
table book.books;”
6、 查看books表中的数据会发现数据乱码
[root@MySQL ~]# mysql -uroot -p123456 -e “select *
from book.books;”
7、 先将表结构导出
[root@MySQL ~]# mysqldump -uroot -p123456
–default-character-set=latin1 -d book>booktable.sql
8、 编辑booktable.sql将latin1修改成utf8
9、 确保数据库不再更新,导出所有数据
[root@MySQL ~]# mysqldump -uroot -p123456 --quick
–no-create-info --extended-insert --default-character-set=latin1
book>bookdata.sql
参数说明:
–quick:用于转储较大的表,强制mysqldumpco能够服务器一次一行的检索数据而不是检索所有行,并输出当前cache到内存中;
–no-create-info:不要创建create table语句;
–extended-insert:使用包括几个values列表的多行insert语法,这样文件更小,IO也小,导入数据时会非常快;
–default-character-set=latin1:按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码。
10、ookdata.sql将SET NAMES latin1修改成SET NAMES utf8
[root@MySQL ~]#
vim bookdata.sql
11、 book2库并将该库的默认字符集设置成utf8
[root@MySQL ~]# mysql -e “create database book2
default charset utf8;” -uroot -p123456
12、 建立表并导入表结构
[root@MySQL ~]# mysql -uroot -p123456
book2<booktable.sql
13、 导入数据
[root@MySQL ~]# mysql -uroot -p123456 book2<bookdata.sql
14、 查看book.books中的默认字符集是否已更改
[root@MySQL ~]# mysql -uroot -p123456 -e “show create
table book2.books;”
15、 查看表内容
[root@MySQL ~]# mysql -uroot -p123456 -e “select *
from book2.books;”