標籤:
問題描述:最近我在寫一個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了
關於從JSP頁面插入資料到資料庫中亂碼問題的解決