1、mysql字符集介绍:
字符集是多个字符的集合,常见的字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。
计算机要处理字符集文字就需要进行字符编码。
ASCII字符集:美国信息互换标准编码,7位(bits)表示一个字符,共128字符,字符值从0到127
ASCII扩展字符集:从ASCII字符集扩充出来的,增加了更多符号,使用8位(bits)表示一个字符,共256字符。
Unicode字符集:支持现今世界各种不同语言的书面文本交换、处理及显示
UTF-8:是Unicode的其中一个使用方式,UTF-8使用可变长度字节来储存Unicode字符,又称万国码
Mysql数据库字符集包括字符集(CHARACTER)和校对规则(COLLATION)是两个概念,
字符集是用来定义mysql数据字符串的存储方式,校对规则定义字符串比较的方式。
注:mysql可以支持多种字符集,同一台服务器,库、表、表的不同字段都可以指定不同的字符集
2、字符集命令:
查看所有字符集:
mysql -uroot -p -e "show character set \G;"
查看常用字符集:
mysql -uroot -p -e "show character set\G;" | egrep "gbk|utf8|latin1" | awk '{print $0}'
查看字符集校对规则:
mysql -uroot -p -e "show collation;"
查看当前数据库的校队规则:
mysql -uroot -p -e "show variables like 'collation%';"
查看mysql当前字符集设置情况:
进入数据库查看:mysql> show variables like ‘character_set%’;
2.1、命令含义解释:
- character_set_client:客户端请求数据的字符集
- character_set_connection:客户机/服务器连接的字符集
- character_set_database:默认数据库的字符集。
- character_set_filesystem:把os上文件名转化成此字符集,即把character_set_client转换
- character_set_filesystem, 默认binary是不做任何转换的
- character_set_results:结果集,返回给客户端的字符集
- character_set_server:数据库服务器的默认字符集
- character_set_system:系统字符集,这个值总是utf8,不需要设置。该字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数名字
2.2、默认情况下字符集选择规则:
(1) 编制mysql时,指定一个默认的字符集(-DDEFAULT_CHARSET=utf8),如果为指定默认是latin1;
(2) 安装mysql后,在配置文件(my.cnf)中指定服务器默认字符集,如未指定,这个值继承自编译时指定的;
(3) 启动mysql时,如果没有在命令行参数中指定默认字符集,则这个值继承自配置文件中的配置,此时character-set-server被设定为这个默认的字符集; 列如:./mysqld --character-set-server=utf8 &
(4) 当创建一个新的数据库时,如不明确指定则这个数据库的字符集被缺省设定为character-set-server;
(5) 当选定了一个数据库时,character_set_databash被设定为这个数据库默认的字符集;
(6) 在数据库里创建表时,表默认的字符集为character_set_database,这个数据库的默认字符集
(7) 当在表内设置列时,如不明确指定,就是表的默认字符集;
3、字符集乱码解决:
3.1、迁移数据:
步骤:1:建库及建表的语句导出,修改为utf8
2:导出之前所有的数据
3:修改mysql服务端和客户端编码为utf8
4:删除原有的库表及数据
5:导入新的建库及建表语句
6:导入之前的数据
3.2、修改数据库配置文件:
要保证数据库服务器默认的字符集是:utf8
修改mysql数据库的配置文件中character-set-server=utf8,重启mysql
[root@xiao4 ~]# vim /etc/my.cnf 修改或加入如下内容👇
character-set-server=utf8
[root@xiao4 ~]# systemctl restart mysqld
3.3、找到错误的字符集:
我出错的数据库是:bobo库下的books表
查看出错的表:
[root@xiao4 ~]# mysql -uroot -p -e “show create table bobo.books;”
显示的字符集是latin1,那么查看一下books表的内容:[root@xiao4 ~]# mysql -uroot -p -e “select * from bobo.books;”
可以看到除了英文、时间,中文全是乱码
3.4、开始恢复:
3.4.1、首先导出表结构:
[root@xiao4 ~]# mysqldump -uroot -p --default-character-set=latin1 -d bobo > bobotable.sql
导出bobo库下的表结构结构,命名为bobotable.sql
编辑bobotable.sql 将字符集latin1修改成 utf8:
[root@xiao4 ~]# vim bobotable.sql #进入文件,把所有latin1的字段改成utf8
%s/latin1/utf8/g
3.4.2、确保数据库不再更新,导出所有数据:
[root@xiao4 ~]# mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 bobo>bobodata.sql
参数说明:
- –quick: 不把select出来的结果放在buffer中,而是直接dump到标准输出。该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中,减少内存消耗。
- –no-create-info:不要创建create table语句
- –extended-insert:使用包括几个values列表的多行insert语法,这样文件更小,IO也小,导入数据时会非常快
- –default-character-set=latin1:按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码
3.4.3、打开bobodata.sql 将SET NAME latin1 修改成 SET NAME utf8:
[root@xiao4 ~]# vim bobodata.sql #修改完成,保存退出
%s/latin1/utf8/g
新建bobo2数据库:
[root@xiao4 ~]# mysql -e “create database bobo2 default charset utf8;” -uroot -p
建立表,导入我们之前导出的表结构:
[root@xiao4 ~]# mysql -uroot -p bobo2 < bobotable.sql
导入数据:
[root@xiao4 ~]# mysql -uroot -p bobo2 < bobodata.sql
到此恢复完成。
3.4.4、查看结果:
[root@xiao4 ~]# mysql -uroot -p -e “select * from bobo2.books;”