一、场景说明:
从前端提交数据到服务器端,服务器端处理后,提交数据到MySQL数据库。当前端提交的数据中包含中文字符时出现了乱码的问题。
二、尝试的解决方案:
1、 查看从前端提交的数据到服务器端时是否已经产生了乱码。可以打印或者DUBUG调试一下,发现并没有出现乱码。为了保证服务器收到的数据缺失是正确的,特定添加了一个Filter,通过Filter,设置request 的编码为UTF-8,设置response的编码为UTF-8,简要代码如下 :
//转换以上为Filter的核心代码,关于web.xml的配置不在详细说明。提供参考的文档: http://blog.csdn.net/jesse621/article/details/12188355
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
if(this.encode != null && !this.encode.equals(""))
{
request.setCharacterEncoding(this.encode);
response.setCharacterEncoding(this.encode);
}
else
{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
}
chain.doFilter(request, response);
2、 从1中发现没有问题后,检查数据库的编码格式是否正确。自己使用的是SQLyog,创建表时使用了默认的编码。
1) 检查了数据库的的编码是否是UTF-8,发现并不是,然后改为UTF-8
2)检查了数据库表的编码是否为UTF-8,发现并不是,然后改为UTF-8
根据以上的检查结果,重新执行后,发现数据库字段依旧出现了乱码。再一次检查数据库的配置:确定以上两点后,这次将数据库的目标锁定为数据表的字段上。
3)使用SQLyog修改表时,在右上角有一个隐藏语言的选择项,默认情况下是选中的。取消选中状态,则可以编辑字段的编码格式,此时设置字段的编码的格式为 UTF-8
根据1)、2)、3)步骤后,基本可以确定,数据库的编码格式已经没有大得问题,再次执行程序,发现数据库中依旧出现乱码。
3、 根据1 和 2 可以确定,出现乱码的原因是在服务器提交数据到数据库的过程中产生的问题,而导致这个问题的原因是协议默认情况下是不支持中文的,需要设置连 接数据的URL:
1)使用文本或者链接地址写到代码中(不推荐)时,实例如下:
jdbc:mysql://localhost:3306/tms?useUnicode=true&characterEncoding=utf8
2) 使用XML文件时:
jdbc:mysql://localhost:3306/tms?useUnicode=true&characterEncoding=utf8
特殊说明: xml中的&等同于文本中的&; 1)、2)中的黑体字便是要在URL上添加的编码设置
重新执行程序,问题得到了解决。不再产生乱码问题。
三、总结
当从前端提交数据到服务端,再从服务端保存数据到数据库中时,如果出现数据库乱码,可以按照以下方法排查:
1、首先java端从前端获取的数据是否已经产生乱码;
2、检查数据库编码格式是否正确。推荐使用UTF-8
1) 数据库的编码是否正确
2) 表的编码是否正确
3) 表中字段的编码是否正确
3、检查服务端连接数据库的编码是否正确
通过以上三者,基本可以解决保存到数据库的数据出现乱码的问题。