解决servlet向mysql添加数据时的中文乱码问题

问题与分析

通过 servlet 向 mysql 中添加数据,在 dao 层使用的是 JdbcTemplate操作的数据库,可是在添加时偏偏出现了中文乱码问题,如下:

问题分析:

 1. 难道是浏览器响应时编码问题?

 2. 难道是数据传输错误?(可能性极小)

 3. 难道是 servlet 在接收时没有设置编码格式?
 
 4.数据库编码格式有误?

排查:

  1. jsp页面接收服务器解析的编码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

均以设置mime类型和字符集

  1. 可能性极小,最后再排查。
  2. servlet在接收请求参数之前已经设置了编码的字符编码
req.setCharacterEncoding("utf-8");
  1. 查询数据库编码字符集

    各列也均为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 ,那么作用有如下两个方面:

  1. 存数据时

数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。

  1. 取数据时

在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。

注意:如果在xml配置文件中配置数据库url时,要使用&的转义字符也就是& amp;

参考:

https://blog.csdn.net/violet_echo_0908/article/details/50264523
https://www.jianshu.com/p/76e3e825c484

页面下部广告