解决servlet向mysql添加数据时的中文乱码问题
问题与分析
通过 servlet 向 mysql 中添加数据,在 dao 层使用的是 JdbcTemplate操作的数据库,可是在添加时偏偏出现了中文乱码问题,如下:
问题分析:
1. 难道是浏览器响应时编码问题?
2. 难道是数据传输错误?(可能性极小)
3. 难道是 servlet 在接收时没有设置编码格式?
4.数据库编码格式有误?
排查:
- jsp页面接收服务器解析的编码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
均以设置mime类型和字符集
- 可能性极小,最后再排查。
- servlet在接收请求参数之前已经设置了编码的字符编码
req.setCharacterEncoding("utf-8");
- 查询数据库编码字符集
各列也均为utf-8编码
<mark>缩小范围</mark>
再次排查数据库,发现使用sql语句或手动添加数据到数据库中可以正常显示中文数据,并且可以回显到浏览器正常显示。
最后定位:
数据发送到数据库的编码已经被修改了,也是通过查阅大量资料
https://zhidao.baidu.com/question/177106978244798884.html
https://blog.csdn.net/fancylovejava/article/details/7700683
最终还是以无效告终,终于在
https://www.jianshu.com/p/76e3e825c484
这篇大佬博客中发现是使用jdbc连接MySQL的url编码有问题
在原有的url=jdbc:mysql:///db尾部添加
<mark>?useUnicode=true&characterEncoding=utf-8</mark>
即可解决中文乱码问题。
原理:
我们添加这个的添加的作用是:指定字符的编码、解码格式。
例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:
- 存数据时:
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。
- 取数据时:
在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
注意:如果在xml配置文件中配置数据库url时,要使用&的转义字符也就是& amp;
参考:
https://blog.csdn.net/violet_echo_0908/article/details/50264523
https://www.jianshu.com/p/76e3e825c484