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修改的值就失效祸轮。可以在my.ini的文件中的[mysqld]標簽中設(shè)置:

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

據(jù)說新版本是:

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

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

2)mysql當(dāng)中苦酱,用戶所使用的某個數(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)系作者
  • 序言:七十年代末匕得,一起剝皮案震驚了整個濱河市继榆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汁掠,老刑警劉巖略吨,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異考阱,居然都是意外死亡翠忠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門乞榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秽之,“玉大人,你說我怎么就攤上這事吃既】颊ィ” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵鹦倚,是天一觀的道長河质。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么愤诱? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任云头,我火速辦了婚禮,結(jié)果婚禮上淫半,老公的妹妹穿的比我還像新娘溃槐。我一直安慰自己,他們只是感情好科吭,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布昏滴。 她就那樣靜靜地躺著,像睡著了一般对人。 火紅的嫁衣襯著肌膚如雪谣殊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天牺弄,我揣著相機與錄音姻几,去河邊找鬼。 笑死势告,一個胖子當(dāng)著我的面吹牛蛇捌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咱台,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼络拌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了回溺?” 一聲冷哼從身側(cè)響起春贸,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遗遵,沒想到半個月后萍恕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓮恭,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雄坪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屯蹦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡碾盐,死狀恐怖揩局,靈堂內(nèi)的尸體忽然破棺而出毫玖,到底是詐尸還是另有隱情,我是刑警寧澤凌盯,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布付枫,位于F島的核電站,受9級特大地震影響驰怎,放射性物質(zhì)發(fā)生泄漏阐滩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一县忌、第九天 我趴在偏房一處隱蔽的房頂上張望掂榔。 院中可真熱鬧,春花似錦芹枷、人聲如沸衅疙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喧伞,卻和暖如春走芋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潘鲫。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工翁逞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溉仑。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓挖函,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浊竟。 傳聞我的和親對象是個殘疾皇子怨喘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349