问题背景:
数据库迁移,使用 mysqldump 导出的文件,创建新的数据库。
原库:MySQL 5.7.17
新库:MySQL 5.7.18
问题:使用新的库,测试发现网页的某个标签下没有查出内容。
尝试:
1,静态复制数据库文件
2,升级 MySQL 到同一个小版本
问题仍然存在。
发现问题的线索:
再三确认排除代码的不一致之后,直接使用 java 的API接口测试。
分别连接老库和新库,发现连接老库可以返回内容,连接新库则不可以。
分别在老库和新库在线开启 MySQL 查询日志,获取查询语句:
SET GLOBAL general_log=1;
开启之后,获得了查询语句,发现问题点,老库上部分SQL语句如下:
and dd_notices.typeName='??'
新库上部分SQL语句如下:
and dd_notices.typeName='通知'
这里是中文的查询条件,猜测导致此问题的大概是字符集问题。
网查了解到如下信息:
mysql 数据库内容可以有多种编码。
首先要知道数据库的编码格式然后在db连接建立的url当中增加条件
useUnicode是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true缺省值为false
characterEncoding当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk
例如:
jdbc:mysql://127.0.0.1:3306/bookDB?useUnicode=true&characterEncoding=utf-8
...
当参数2号为中文字符的时候如果db连接url不增加字符集则查不出任何行,英文任何字符集都支持
参考:http://blog.sina.com.cn/s/blog_5ff02a9f0100y7ot.html
那估计问题处在 jdbc 连接参数上面,在参数里面添加 "&characterEncoding=UTF-8":
jdbc.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
重启 tomcat 之后,可以返回结果了。
证明问题是在这里。
留下的问题:之前没有加这个参数,连接老库是没有字符集的问题呢? 猜测跟 MySQL 这边的默认设置有关系。