问题描述:最近我在写一个j2ee的留言板系统模块,遇到了一个非常让我头大的问题,当我从JSP页面输入数据后,通过hibernate中的业务逻辑类HQL语句把这个数据插入到本地的mysql数据库中,可是当我发现成功插入后在数据库中看到的是乱码,再回显到浏览页面中看到的也是一堆乱码,我的jsp页面设置编码为UTF-8,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
然后我查看我本地的数据库编码方式也为UTF-8,如下:
表 | 操作 | 行数 | 类型 | 排序规则 | 大小 | 多余 | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
tb_manager | 浏览 | 结构 | 搜索 | 插入 | 清空 | 删除 | 2 | InnoDB | utf8_general_ci | 16 KB | - | ||
tb_reply | 浏览 | 结构 | 搜索 | 插入 | 清空 | 删除 | 5 | InnoDB | utf8_general_ci | 16 KB | - | ||
tb_topic | 浏览 | 结构 | 搜索 | 插入 | 清空 | 删除 | 19 | InnoDB | utf8_general_ci | 16 KB |
可是问题还是没有解决,我各种百度都没能解决,我就想,数据是在插入的数据库前就已经乱码还是插入到数据库后才乱码的呢?
于是我就在插入数据库前把要插入的数据打印到控制台,果然是一堆乱码。网上说一般页面的编码是ISO-8859-1我就写了一个方法把获取到数据先转换为UTF-8在插入到数据库中
方法的代码如下:
public String toChinese(String strvalue){
try {
if (strvalue==null||strvalue.equals("")) {
return "";
} else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "UTF-8");
return strvalue;
}
} catch (Exception e) {
return "";
}
}
写完后再次插入数据后把转换后的数据打印到控制台,发现乱码已经成功转换为中文了,可是问题又来了,数据库中的数还是乱码,这时我就明白了(数据在插入前插入后都会经过编码转换),好坑爹啊(*^__^*) ,jsp页面上输入的数据会把数据转换为ISO8859-1,插入到数据库的过程还会把这个数据转换为另一种编码,中间会经过多少次编码的转换我真搞不懂O(∩_∩)O~我在数据库中写了这个 sql语句
show variables like 'char%';结果为
Variable_name | Value | |
---|---|---|
character_set_client | utf8mb4 | |
character_set_connection | utf8mb4 | |
character_set_database | latin1 | |
character_set_filesystem | binary | |
character_set_results | utf8mb4 | |
character_set_server | latin1 | |
character_set_system | utf8 | |
character_sets_dir | C:\xampp\mysql\share\charsets\ |
一看才知道数据库不是UTF-8的啊,我去O(∩_∩)O~,这个显示我的数据库设置的编码是Latin1,我真是醉了Latin1就是ISO-88859-1的别名啊,前面白转了,。后来在我的hibernate配置文件中加了这个东西,把数据库连接设置为UTF-8就把问题解决了
<!-- 数据库连接的URL -->
<property name="connection.url">jdbc:mysql://localhost:3306/db_board?useUnicode=true&characterEncoding=utf-8 </property>
上面的斜线部分
再次用show variables like 'char%';查询我的数据库编码,结果如下:
Variable_name | Value | |
---|---|---|
character_set_client | utf8mb4 | |
character_set_connection | utf8mb4 | |
character_set_database | utf8 | |
character_set_filesystem | binary | |
character_set_results | utf8mb4 | |
character_set_server | latin1 | |
character_set_system | utf8 | |
character_sets_dir | C:\xampp\mysql\share\charsets\ |
最后再次测试,插入到数据库中的数数据终于完美显示为中文了,真是~~o(>_<)o ~~泪奔,这个问题搞了我两天,早上睡不着5点多醒来就搞,也是佩服我自己,最后美美的睡了一觉,O(∩_∩)O哈哈~
总结:其实回过头来看,我一开始就错误的以为自己的数据库是UTF-8,把排序规则错误的以为就是UTF-8,其实用show variables like 'char%';才能知道你的数据库编码方式是啥,其实我上面的写的方法就是把JSP页面的获取到的数据编码从UTF-8转换为ISO-8859-1,之后再插入到数据库中,会乱码只是数据库没有设置为UTF-8而已,把hibernate配置文件的数据库连接后面加上?useUnicode=true&characterEncoding=utf-8这句话就好了,这样就把数据库编码设置为UTF-8了