問題描述:最近我在寫一個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了