最近在mysql数据库环境工作了2个月,由于上游提供的数据各种各样,数据入库总是碰到错误,今天小编总结下处解决中文乱码的思路:
介绍前先普及下mysql关于字符集有哪些变量
mysql> show variables like ‘%char%’;
character_set_database : 数据库的字符集,即use databasename对应得数据库名字符集
character_set_server: 默认的内部操作字符集 ,创建一个数据库时不指定字符集,以此参数的字符集为数据库默认字符集
character_set_client: 客户端使用的编码,如GBK, UTF8 比如你写的sql语句是什么编码的。
character_set_results :查询返回的结果集的编码(从数据库读取的数据是什么编码的)。
character_set_connection: 连接使用的编码
character_set_system:系统元数据(字段名等)字符集
它们之间存在一个转换过程(具本的还请见手册):
character_set_client -> character_set_connection >内部操作字符集->character_set_results,具体关系这里不介绍,此链接http://www.cnblogs.com/lazyno/archive/2015/02/07/4278544.html
http://www.jb51.net/article/29960.htm有关其中关系
回到我在工作中碰到场景:
数据文件是utf8编码,数据库对应变量字符集为:*
mysql> show variables like ‘%char%’;
+————————–+———————————————+
| Variable_name | Value |
+————————–+———————————————+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | gbk |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/percona-xtradb-cluster/charsets/
导入报错:
解决方案一:修改数据库的字符集为utf8
解决方案二:load导入指定字符集
结果查询显示中文需考虑的是:character_set_results和控制终端的编码决定
在场景一使用导入成功查询结果:
因此查询结果正常显示中文需要终端(我使用secureCRT工具)和数据库变量character_set_results一致才可以
举例场景文件是UTF8,数据库编码是GBK;反之数据文件GBK,数据库编码是UTF8也是同理
数据库导出的文件编码为UTF8,在WINODWS查看乱码,因此在导出时也可以指定编码导出。查看我的博客http://blog.csdn.net/qq_32041579/article/details/72627974中导出的CSV即是在WINDOWS下可以正常显示中文
个人总结:
导入
1. 碰到导入字符集的问题,先要检查数据库变量对应编码(character_set_databasename) 2. 查看导入文件的编码(file 2131res.del) 3. 对照两个编码是否相等 4. 解决有什么方法可以修改其编码一致或者指定数据库以什么编码读入文件(有些文件不指定编码 就默认数据库的编码入文件,因此报错;但有些编码文件可以根据文件推测出其编码即不用 默认编码)
查询
1.查看数据库输出字符集变量character_set_databasename与终端编码是否一致