java 解决中文乱码的糟心之旅

在单位接手一个项目,java开发的,做开发多年,解决过各种奇葩问题,没想到差点在java中文乱码这跌跟头。

背景:

java项目是在另一个部门移过来的线上的工程,使用maven构建开发。迁移过来后在本地打包,传到服务器上遇到提交中文到数据库中是乱码的问题。

尝试解决方案:

1. 查看jdbc链接属性: jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx?useUnicode=true
确认使用参数testUnicode=true

2.确认数据库及表的编码(数据库也是从原部门直接dump过来的)
1)查看数据库编码:database encoding='utf-8 unicode';database collation='utf-8 unicode'
2)确认表、行编码,也是utf8;

3. 确认入参编码格式问题:
1)准备参数,通过浏览器拿到提交表单的curl命令
2)把curl的目标地址换成原部门测试环境,结果中文不会乱码,再把目标地址换回本地环境,结果中文乱码

4. 确认代码
1)跟原部门确认,代码是线上的,maven配置也是和线上环境一直的,线上一直没问题

5. 确认容器问题:
1)开始查看tomcat容器,tomcat用的是9(最新的)。在server.xml中设置 Connector 添加属性URIEncoding="UTF-8"(据说在tomcat8之后默认就是utf8了),结果不行
2)修改tomcat catalina.sh 文件,添加 JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8",结果不行
3)从原部门要来tomcat包(线上的),使用他们的tomcat,结果不行
4)原部门包分别执行5、6步骤,结果不行
5)yum下载tomcat重新部署,不行,分别执行5、6步骤,不行

到现在为止,已经过去了1天的时间,确定了入参、容器、代码还是没有解决问题(555555),从头开始。。。
1. 确认jdbc链接参数,发现useUnicode=true,但是没有写characterEncoding=utf-8,添加该参数,结果成功了,中文不再是乱码

已经找到了问题,是数据库链接的问题,为什么同样的数据库链接配置在原部门可用,在我们这就不行呢?继续~,去server上看my.cof,发现mysqld中没有设置默认编码,于是在[mysqld]中添加:character-set-server=utf8,重启mysql;从jdbc中拿掉characterEncoding参数,重新打包发布;结果ok。

后记心得:

1. 在部署mysql时,不要偷懒,一定要确认编码格式
2. 在代码中链接数据时,一定要显示指明编码情况,仅仅useUnicode=true是不够的(不能依赖数据库的配置)
3. 老生长谈的话,没有灵异的事件,只有没有发现的细节,慢慢来!!
4. 要有空杯心态,不要盲目的相信经验。解决不了的问题多余人交流。

此条目发表在java分类目录,贴了, 标签。将固定链接加入收藏夹。