MySQL 配置文件中忘配置default-character-set引发的乱码问题
字符集参考文献:
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_character_set_connection
http://dev.mysql.com/doc/refman/5.6/en/faqs-cjk.html
今天,一开发同事使用jdbc连接数据库执行一条语句无结果集,但是通过sqlyou执行相同的语句有返回结果。
执行的语句where条件中含有中文,这应该是字符集引起的
此开发测试实例刚迁移不久的,查看迁移前的环境默认字符集都是utf8
查看当前数据库的字符集
mysql> show variables like '%charac%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
- character_set_client
- character_set_connection
- character_set_results
以上三个控制mysql client的字符集
- character_set_database
设置数据库的默认字符集
- character_set_server
设置以上所有的默认字符集
发现server端的字符集和client端的全局字符集设置变量都是采用的默认值latin1
发现配置文件中没有添加参数项 character-set-server=utf8
造成乱码的原因:
数据存储时的编码解码过程
jdbc=>character_set_client=>table character
每个环节的字符集编码都是utf8,没有转码过程
character_set_client变为latin1后,读取数据的解码过程为
jdbc<=character_set_client<=table character
表中存储的是utf8编码格式,判断和character_set_client不一致则转码为latin1的二进制流,然后传输给远端的客户端,
客户端jdbc通过设置的字符集展示结果,使用utf8展示latin1,所以出现了乱码。
解决办法
# character_set_filesystem 、character_set_system 、character_sets_dir除外都变更全局为utf8
所有的应用需要重连数据库才能变更会话级别的字符集
对于在字符集设置为latin1期间插入的数据编码存储过程:
- 在terminal(这里为jdbc客户端)中使用输入法输入
- terminal转换成utf8二进制流
- 二进制流通过MySQL客户端传输到MySQL Server
- Server通过character-set-client解码
- 判断character-set-client和目标表的charset是否一致,character-set-client为latin1,目标表的字符集为utf8
- 不一致则进行一次从client-charset到table-charset的一次字符编码转换,由latin1转码为utf8
- 将转换后的字符编码二进制流存入文件中
测试这种情况下将 中间环节的character-set-client变更为utf8,是否会出现乱码
mysql> show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec) mysql> update t1 set col='建军节' where id=4; mysql> select * from t1 where id=4;
+----+-----------+------+
| id | col | time |
+----+-----------+------+
| 4 | 建军节 | NULL |
+----+-----------+------+ 解码编码转储 crt terminal =》character_set_client =》character_set_server
utf8 latin1 utf8
如果查询时任何一个环节的字符集变化都可能会造成乱码
更改不同环节的字符集对应的数据显示
1、改变客户端的字符集
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec) mysql> select * from t1 where id=4;
+----+-----------------------+------+
| id | col | time |
+----+-----------------------+------+
| 4 | ??o???è?? | NULL |
+----+-----------------------+------+
2、更改crt terminal 的字符集为default
mysql> select * from t1 where id=4;
+----+-----------+------+
| id | col | time |
+----+-----------+------+
| 4 | 寤哄啗鑺 | NULL |
+----+-----------+------+
3、更改表字段字符集
ALTER TABLE t1 CHANGE col col varchar(10) CHARACTER SET latin1; mysql> select * from t1 where id=4;
+----+-----------+------+
| id | col | time |
+----+-----------+------+
| 4 | 建军节 | NULL |
+----+-----------+------+
更改表的字符集为latin1,读取数据涉及到变更的环节变为
- 从文件读出二进制数据流(utf8存入)
- 用表字符集latin1编码进行解码
- 将数据转换为character-set-client的编码laint1
对应的变更前的环节:
- 从文件读出二进制数据流(utf8存入)
- 用表字符集utf8编码进行解码
- 将数据转换为character-set-client的编码laint1
可以看出更改表数据字符集没有导致乱码的原因是,字符集整体经历的解码和转码过程是一致的,都经历了一次由utf8到latin1的转码。
另一有关字符集的问题:为了支持表情符号,将系统级别的utf8设置为utf8mb4且相应的表也做了字符集的转变,重启应用不生效,重启数据库和应用才会生效
参考文章为:
http://blog.sina.com.cn/s/blog_93b45b0f0101glfx.html
参考文章:
编码解码过程 : http://cenalulu.github.io/mysql/mysql-mojibake/
MySQL 配置文件中忘配置default-character-set引发的乱码问题的更多相关文章
- 【转】MyBatis学习总结(三)——优化MyBatis配置文件中的配置
[转]MyBatis学习总结(三)——优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的con ...
- Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突
原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...
- Prometheus 配置文件中 metric_relabel_configs 配置--转载
Prometheus 配置文件中 metric_relabel_configs 配置 参考1:https://www.baidu.com/link?url=YfpBgnD1RoEthqXOL3Lgny ...
- MyBatis学习总结(三)——优化MyBatis配置文件中的配置(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013548.html 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置 ...
- MyBatis入门学习教程-优化MyBatis配置文件中的配置
一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: 1 <?xml version=" ...
- MyBatis学习总结(三)——优化MyBatis配置文件中的配置
一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: 1 <?xml version=" ...
- MyBatis学习总结(三)——优化MyBatis配置文件中的配置
一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: <?xml version="1 ...
- MyBatis——优化MyBatis配置文件中的配置
原文:http://www.cnblogs.com/xdp-gacl/p/4264301.html 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写 ...
- MyBatis学习总结_03_优化MyBatis配置文件中的配置
一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: 1 <?xml version=" ...
随机推荐
- 转!!left join on and 与 left join on where的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1. on条件是在生成临时 ...
- easymock所测试的方法内部新NEW对象的处理
问题:当记录的方法的参数是方法所在类内部新NEW的对象时,静态的记录方法交互就会失效,例如 调用的方法: public calss A{ public void method(User u){ u.s ...
- Modbus RTU程序开发解读
Modbus是很好的串口通信协议,其中RTU协议最为常用,通过Modbus RTU,我们可以轻松读写串口信息. 从官网下载libModbus,观察modbus.h可知关键的结构体为: typedef ...
- 自定义scrollview右侧的滑动条
在做这个功能之前我其实是拒绝的,为什么这么说呢,因为我怕麻烦啊!(开玩笑的,怕麻烦就不做程序员了) 很久没有写博客,这次刚好项目中有个有趣的东西,想拿出来分享一下,希望能帮到某些小伙伴. 首先说说需求 ...
- SPSS数据分析—判别分析
判别分析作为一种多元分析技术应用相当广泛,和其他多元分析技术不同,判别分析并没有将降维作为主要任务,而是通过建立判别函数来概括各维度之间的差异,并且根据这个判别函数,将新加入的未知类别的样本进行归类, ...
- div在不固定高度的情况下垂直或者水平居中
方法一: 用一个"ghost"伪元素(看不见的伪元素)和 inline-block / vertical-align 可以搞定居中,非常巧妙.但是这个方法要求待居中的元素是 inl ...
- 3d旋转
<!DOCTYPE html><html lang="zh-cmn-Hans"><head><meta charset="utf ...
- SWM格式稀疏权重矩阵转换为方阵形式全过程分享
在进行空间统计实验过程中,经常涉及到空间权重矩阵的处理,有时候需要将ArcGIS生成的swm格式的权重矩阵转换为形如“0 1”的方阵格式.这里将我的办法整理出来. 1.用如下工具箱生成swm格式的权重 ...
- 关于display:inline-block和float:left的区别
<div class="pag"> <a href="#">首页</a> <a href="#"& ...
- php file_get_contents() 用法
php 需要访问某个网页 <?php $fh= file_get_contents('http://www.baidu.com/'); echo $fh; ?> 知识扩充 file_get ...