java jdbc 连接参数引发的问题,查询条件带中文(java+mysql)

问题背景:

数据库迁移,使用 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 这边的默认设置有关系。

你可能感兴趣的:(java jdbc 连接参数引发的问题,查询条件带中文(java+mysql))