book,由于之前建表没注意字符集的问题,导致之前写入的数据出现乱码。现在要将之前的数据和现在数据的字符集一致,不出现乱码情况,将字符集为 latin1 已有记录的数据转成 utf8,并且已经存在的记录不乱码。
操作步骤:
- 建库及建表的语句导出,修改为 utf8
- 导入之前的数据
- 导入新的建库及建表语句
- 删除原有的库表及数据
- 修改 mysql 服务端和客户端编码为 utf8
- 导出之前所有的数据
设置数据库字符集为 utf8
修改/etc/my.cnf 配置文件中 character-set-server=utf8,重启 mysql
[root@ weiyi~]# vim /etc/my.cnf
character-set-server=utf8
[root@weiyi ~]# systemctl restart mysqld
查看 books 表的字符集
Mysq> show create table book.books ;
或者在shell环境 mysql -uroot -p123456 -e “show create table book.books;”
查看表内容
mysql>mysql -uroot -p123456 -e “select * from books”
导出数据表结构
[root@weiyi ~]# mysqldump -uroot -p123456 --default-character-set=latin1 -d book> booktable.sql
编辑 booktable.sql 将 latin1 修改成 utf8
[root@ weiyi~]# vim booktable.sql
确保数据库不再更新,导出所有数据
[root@weiyi ~]# mysqldump -uroot -p123456 --quick --no-create-info --extended-insert --default-character-set=latin1 book>bookdata.sql
--quick:用于转储大的表,强制 mysqldump 从服务器一次一行的检索数据而不是检素所有行,并输出当前 cache 到内存中
--no-create-info:不要创建 create table 语句
-extended-insert:使用包括几个 values 列表的多行 insert 语法,这样文件更小,I0也小,导入数据时会非常快
--default-character-set=latin1:按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码
打开 bookdata.sql 将 SET NAME latin1 修改成 SET NAME utf8
新建 book2 库
[root@weiyi ~]# mysql -e "create database book2 default charset utf8;" -uroot -p123456
导入我们之前导出的表结构
[root@weiyi ~]# mysql -uroot -p123456 book2 <booktable.sql
导入数据
[root@weiyi ~]# mysql -uroot -p123456 book2 <bookdata.sql
查看结果
[root@weiyi ~]# mysql -uroot -p123456 -e"show create table book2.books;"
[root@ weiyi~]# mysql-uroot -p123456 -e"select * from book2.books;