JDBC向数据库提交中文数据乱码的问题

使用JDBC提交中文数据时,尽管数据库和本地Servlet都设置好了编码utf-8和utf8,但是数据依然显示???乱码。

解决办法:创建Connection  conn = DriverManager(url,username,password)中的url,原本设置为:jdbc:mysal://localhost:3306/数据库名,在数据库名后面,加上:

?useUnicode=true&characterEncoding=utf-8

作用是:

例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:

1. 存数据时:

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

2.取数据时:

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

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

例如:<property name="url" value="jdbc:mysql://localhost:3306/email?useUnicode=true&amp;characterEncoding=UTF-8" />

问题解决。

初步原因分析:

在数据库中,使用命令: show variables like '%char%';  可以看到类似下面的结果:

+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+

可见,数据库的编码不仅仅是创建数据库时设置的default  charset。因此添加url的编码设置,也就可以理解了。

猜你喜欢

转载自blog.csdn.net/wargon/article/details/81140135