亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JDBC連接mysql亂碼異常問題處理總結(jié)

 更新時間:2017年12月08日 09:49:15   作者:追求技術(shù)的萌新  
這篇文章主要介紹了JDBC連接mysql亂碼異常問題處理的辦法和思路,有需要的朋友參考學(xué)習(xí)下。

前段時間學(xué)習(xí)JDBC,要連接mysql獲取數(shù)據(jù)。按照老師的樣例數(shù)據(jù),要存一些名字之類的信息,用的都是英文名,我當(dāng)時就不太想用英文,就把我室友的名字存了進(jìn)去,嘿嘿,結(jié)果,出問題了。

 連接數(shù)據(jù)庫語句:

static final String DB_URL = "jdbc:mysql://localhost/filemanagement";

查詢語句:

private static final String theUserQuery = "SELECT name, password, role FROM userinfo WHERE name = ?";

我是用我的名字做的查詢,NullPointerException,很明顯,沒有用我的名字查到對應(yīng)的數(shù)據(jù),而數(shù)據(jù)庫中是存在的。這是為什么呢?

百度到的答案是中文亂碼,解決方案是,修改連接數(shù)據(jù)庫語句為:

static final String DB_URL = "jdbc:mysql://localhost/filemanagement?useUnicode=true&characterEncoding=GBK";

重試!

可以了!但這是為什么呢?那兩個參數(shù)是什么?為什么加上之后就解決問題了?

這兩個參數(shù)解釋如下:

兩個參數(shù)的缺省值都是false。也就是說我們在連接mysql的時候指定了連接使用的字符集后,一切就正常了。但我還是不太了解其中的機(jī)制,所以繼續(xù)查。

原來Mysql連接進(jìn)行查詢等操作時存在一個字符集轉(zhuǎn)換過程:

1. MySQL Server收到請求時將請求數(shù)據(jù)從character_set_client轉(zhuǎn)換為character_set_connection;

2. 進(jìn)行內(nèi)部操作前將請求數(shù)據(jù)從character_set_connection轉(zhuǎn)換為內(nèi)部操作字符集,其確定方法如下:

• 使用每個數(shù)據(jù)字段的CHARACTER SET設(shè)定值;

• 若上述值不存在,則使用對應(yīng)數(shù)據(jù)表的DEFAULT CHARACTER SET設(shè)定值(MySQL擴(kuò)展,非SQL標(biāo)準(zhǔn));

• 若上述值不存在,則使用對應(yīng)數(shù)據(jù)庫的DEFAULT CHARACTER SET設(shè)定值;

• 若上述值不存在,則使用character_set_server設(shè)定值。

3. 將操作結(jié)果從內(nèi)部操作字符集轉(zhuǎn)換為character_set_results。

這些character set代表什么呢?

character_set_server:默認(rèn)的內(nèi)部操作字符集

character_set_client:客戶端來源數(shù)據(jù)使用的字符集

character_set_connection:連接層字符集

character_set_results:查詢結(jié)果字符集

character_set_database:當(dāng)前選中數(shù)據(jù)庫的默認(rèn)字符集

character_set_system:系統(tǒng)元數(shù)據(jù)(字段名等)字符集

還查到了一些常見問題,雖然和我的問題不太一樣,但很有參考意義。

• 向默認(rèn)字符集為utf8的數(shù)據(jù)表插入utf8編碼的數(shù)據(jù)前沒有設(shè)置連接字符集,查詢時設(shè)置連接字符集為utf8

– 插入時根據(jù)MySQL服務(wù)器的默認(rèn)設(shè)置,character_set_client、character_set_connection和character_set_results均為latin1;

– 插入操作的數(shù)據(jù)將經(jīng)過latin1=>latin1=>utf8的字符集轉(zhuǎn)換過程,這一過程中每個插入的漢字都會從原始的3個字節(jié)變成6個字節(jié)保存;

– 查詢時的結(jié)果將經(jīng)過utf8=>utf8的字符集轉(zhuǎn)換過程,將保存的6個字節(jié)原封不動返回,產(chǎn)生亂碼……

• 向默認(rèn)字符集為latin1的數(shù)據(jù)表插入utf8編碼的數(shù)據(jù)前設(shè)置了連接字符集為utf8

– 插入時根據(jù)連接字符集設(shè)置,character_set_client、character_set_connection和character_set_results均為utf8;

– 插入數(shù)據(jù)將經(jīng)過utf8=>utf8=>latin1的字符集轉(zhuǎn)換,若原始數(shù)據(jù)中含有\(zhòng)u0000~\u00ff范圍以外的Unicode字 符,會因為無法在latin1字符集中表示而被轉(zhuǎn)換為“?”(0x3F)符號,以后查詢時不管連接字符集設(shè)置如何都無法恢復(fù)其內(nèi)容了。

(此部分摘自鳥哥的blog,稍后附上鏈接)

我數(shù)據(jù)庫的表都是設(shè)置的utf8編碼,但我第一次連接的時候沒有設(shè)置連接字符集,所以默認(rèn)為latin1,經(jīng)過了從utf8=>latin1的轉(zhuǎn)換,所以產(chǎn)生亂碼。我第二次用的GBK編碼,也沒用utf8編碼,為什么也可以了呢?其實是一個道理,中文不在latin1的編碼中可是在GBK和utf8中,所以不會出問題。

以上就是為大家整理的關(guān)于JDBC連接mysql亂碼異常的解決辦法,如果大家還有任何不明白的地方可以在下方的留言區(qū)討論。

相關(guān)文章

  • MyBatis-Plus邏輯刪除和字段自動填充的實現(xiàn)

    MyBatis-Plus邏輯刪除和字段自動填充的實現(xiàn)

    本文主要介紹了MyBatis-Plus邏輯刪除和字段自動填充的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java簡單幾步實現(xiàn)一個二叉搜索樹

    Java簡單幾步實現(xiàn)一個二叉搜索樹

    二叉樹包含了根節(jié)點,孩子節(jié)點,葉節(jié)點,每一個二叉樹只有一個根節(jié)點,每一個結(jié)點最多只有兩個節(jié)點,左子樹的鍵值小于根的鍵值,右子樹的鍵值大于根的鍵值,下面這篇文章主要給大家介紹了關(guān)于如何在Java中實現(xiàn)二叉搜索樹的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • spring cloud 使用Eureka 進(jìn)行服務(wù)治理方法

    spring cloud 使用Eureka 進(jìn)行服務(wù)治理方法

    這篇文章主要介紹了spring cloud 使用Eureka 進(jìn)行服務(wù)治理方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java中easypoi導(dǎo)入excel文件列名相同的處理方案

    Java中easypoi導(dǎo)入excel文件列名相同的處理方案

    這篇文章主要介紹了Java中easypoi導(dǎo)入excel文件列名相同的處理方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java實現(xiàn)隊列的三種方法集合

    Java實現(xiàn)隊列的三種方法集合

    這篇文章主要介紹了Java實現(xiàn)隊列的三種方法集合,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Mac上配置JDK?1.8的超詳細(xì)流程

    Mac上配置JDK?1.8的超詳細(xì)流程

    相信每個拿到MAC的小伙伴都是很欣喜的,但是由于MAC系統(tǒng)與WIN系統(tǒng)有著極大的不同,所以使用起來會有一些小困擾,這篇文章主要給大家介紹了關(guān)于Mac上配置JDK?1.8的超詳細(xì)流程,需要的朋友可以參考下
    2023-11-11
  • JetBrains IntelliJ IDEA 2020安裝與使用教程詳解

    JetBrains IntelliJ IDEA 2020安裝與使用教程詳解

    這篇文章主要介紹了JetBrains IntelliJ IDEA 2020安裝與使用教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 在lambda的foreach遍歷中break退出操作(lambda foreach break)

    在lambda的foreach遍歷中break退出操作(lambda foreach break)

    這篇文章主要介紹了在lambda的foreach遍歷中break退出操作(lambda foreach break),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 一文帶你解讀所有HashMap的面試題

    一文帶你解讀所有HashMap的面試題

    HashMap在面試的時候,是非常容易被問到的。因為在JDK8出來之后,非常容易被問到關(guān)于HashMap的知識點,而如果對于沒有研究過他的源代碼的同學(xué)來說,這個可能只是說出一部分來。本文就把HashMap上面大部分會被在面試中問到的內(nèi)容,做個總結(jié),希望有所幫助
    2022-09-09
  • spring項目中切面及AOP的使用方法

    spring項目中切面及AOP的使用方法

    我們知道,spring兩大核心,IOC(控制反轉(zhuǎn))和AOP(切面),那為什么要使用AOP,AOP是什么呢?帶著這些問題通過本文學(xué)習(xí)下吧
    2021-06-06

最新評論