Java通過JDBC插入中文亂碼問題

其實也就三層:

1、前端頁面

2、后臺代碼

3、數(shù)據(jù)庫

1、前端

前端就是設(shè)置頁面的字符集


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

2、前端接受的數(shù)據(jù)傳入后臺

一般我們是通過request.getParameter("XXX")方式獲取數(shù)據(jù)的,但是就算前端頁面字符集是正確的,也有可能在這一層出現(xiàn)問題。

因為傳遞中文的時候,有可能用A編碼拆解成Byte去傳遞,結(jié)果還原的時候使用B編碼還原,這就導(dǎo)致原來的數(shù)據(jù)出現(xiàn)亂碼或者???。。。等問題。

因此,我們可以通過*String里面不同的構(gòu)造方法來解決這個問題。(我們在第3部分,來修正這個問題)

3、后臺代碼

這里分為兩塊講:

1)

先設(shè)置開發(fā)工具的編碼類型,一般來說是默認是gbk,但是這里我用utf-8,所以就得修改

有兩個地方要改:

Windows里面的Preferences(首選項框),在general里面找workspace,右側(cè)有text file encoding,改為utf-8(這個是開發(fā)ide的字符集修改)

鼠標點擊你的項目最頂層,然后在project里面找到這個項目的字符編碼,改為utf-8(項目的字符集修改)

2)

因為我如上所說的問題,所以代碼要在獲取數(shù)據(jù)之前指明request和response的編碼類型(我這里都用utf-8)


response.setContentType("text/html;charset=utf-8");

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("utf-8");

設(shè)置完成之后,可以這么獲取中文字符!


String name = new String(request.getParameter("name").getBytes("utf-8"), "utf-8"));

這里寫了兩個utf-8大家就會有點迷茫,其實是這個意思,第一個utf-8是說明從前端拿過來的byte是什么編碼格式的,第二個utf-8是指定把我的String字符串轉(zhuǎn)換成什么編碼格式。

一般來說使用new String(request.getParameter("name").getBytes(),"utf-8");就可以,盡量避免字符串的編碼轉(zhuǎn)來轉(zhuǎn)去,這樣會出現(xiàn)效率低下的問題,記得,先嘗試用最簡單的方式獲取,然后在后臺打印下它的值,如果顯示正常,那么證明設(shè)置的沒有問題!

關(guān)于后臺代碼,能改的差不多就這些

4、后臺代碼通過jdbc寫sql將數(shù)據(jù)傳入數(shù)據(jù)庫(mysql為例)

這里還是有個比較惡心的地方,就是mysql如果你的字符集沒有設(shè)置,或者沒有設(shè)置好的話,默認是latin1

那么你的utf-8直接傳過來還是會出問題。

因此mysql的url要這樣寫:

//useUnicode表示允許使用自定義的Unicode,

//characterEncoding是給定自定義的Unicode是什么


String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";

我之前遇到中文在數(shù)據(jù)庫中顯示???(問號)的問題,就是因為沒有拼接上這兩個參數(shù)。因此mysql解析從后臺代碼傳過去的字符串的時候,通過編碼類型去解析,所以就顯示不出正確的中文!

5、最后一步就是mysql字符集的設(shè)置

其實應(yīng)該先分清楚有哪些字符集可以設(shè)置?

1)mysql的某個庫的字符集查看

可以通過use databasename;然后show variables like "%chara%"; 這個命令先查看下自己所使用的那個庫的字符集都是什么

character_set_client為客戶端編碼方式;

character_set_connection為建立連接使用的編碼方式;

character_set_database為數(shù)據(jù)庫的編碼方式;

character_set_results是結(jié)果集的編碼方式;

character_set_server為數(shù)據(jù)庫服務(wù)器的編碼方式。

只要保證以上采用的編碼方式一樣,就不會出現(xiàn)亂碼問題。

可以用如下的命令去修改:

set character_set_database="utf8";

以此類推,改成如上圖所示(或者符合自己的要求即可)。

然后可能會出現(xiàn)重啟完mysql修改的值就失效??梢栽趍y.ini的文件中的[mysqld]標簽中設(shè)置:

default-character-set=utf8(但是這個是老版本的設(shè)置方式,具體什么版本,沒測過實在抱歉)

據(jù)說新版本是:

character_set_server=utf8這個來代替之前的設(shè)置(大家可以自己嘗試下哪個生效)

設(shè)置完之后,mysql重啟下,應(yīng)該字符編碼就沒問題了

2)mysql當中,用戶所使用的某個數(shù)據(jù)庫的字符集

這個就是創(chuàng)建數(shù)據(jù)庫的時候設(shè)置的字符編碼


CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

utf8_general_ci是一種校對規(guī)則,有興趣可以自己研究下。

也可以在連接工具上直接編輯數(shù)據(jù)庫,來修改數(shù)據(jù)庫的字符集!

3)某個具體數(shù)據(jù)庫中的某張表的字符集

這個就是創(chuàng)建某張表的時候指定字符編碼


CREATE TABLE mytable(

 id varchar(40) NOT NULL default '', 

 userId varchar(40) NOT NULL default ''

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

也可以在連接工具上直接改變表,來修改表的字符集!

其實就是把所有能改的地方全部改成utf-8(在數(shù)據(jù)庫中是utf8,沒有中間的 “ - ” ,千萬別加上去了)

提醒下,記得遇到報錯,要一層一層排錯!

1、首先是前端傳到后臺的數(shù)據(jù),在后臺能正常打印嗎?

2、其次是后臺傳輸?shù)綌?shù)據(jù)庫中的這個過程有沒有問題?

3、數(shù)據(jù)庫的字符編碼都是一樣的嗎?

像2和3這兩個方面,你可以拿一條帶中文的數(shù)據(jù),直接在數(shù)據(jù)庫里面insert一條,如果插入進去,并且中文沒有異常,證明數(shù)據(jù)庫這邊是沒有問題的,那么就是傳輸時候的問題,很有可能是上述講的url沒有拼接那兩條參數(shù)。


作者:lsr40

來源:CSDN

原文:https://blog.csdn.net/lsr40/article/details/78736855

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容