最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前段時(shí)間學(xué)習(xí)JDBC,要連接mysql獲取數(shù)據(jù)。按照老師的樣例數(shù)據(jù),要存一些名字之類的信息,用的都是英文名,我當(dāng)時(shí)就不太想用英文,就把我室友的名字存了進(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";

重試!

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

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

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

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

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

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

• 使用每個(gè)數(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í)設(shè)置連接字符集為utf8

– 插入時(shí)根據(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)換過程,這一過程中每個(gè)插入的漢字都會(huì)從原始的3個(gè)字節(jié)變成6個(gè)字節(jié)保存;

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

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

– 插入時(shí)根據(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字 符,會(huì)因?yàn)闊o法在latin1字符集中表示而被轉(zhuǎn)換為“?”(0x3F)符號(hào),以后查詢時(shí)不管連接字符集設(shè)置如何都無法恢復(fù)其內(nèi)容了。

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

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

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

相關(guān)文章

  • 詳解如何提升SpringBoot項(xiàng)目的吞吐量

    詳解如何提升SpringBoot項(xiàng)目的吞吐量

    吞吐量是指系統(tǒng)在單位時(shí)間內(nèi)成功處理請求的數(shù)量,當(dāng)吞吐量不足以應(yīng)對業(yè)務(wù)需求時(shí),會(huì)導(dǎo)致請求Pile Up的情況發(fā)生,使系統(tǒng)不可用甚至宕機(jī),所以提高吞吐量是保證系統(tǒng)可用性的有效手段之一,本文就給大家講講如何提升SpringBoot項(xiàng)目的吞吐量
    2023-07-07
  • 詳解java.lang.NumberFormatException錯(cuò)誤及解決辦法

    詳解java.lang.NumberFormatException錯(cuò)誤及解決辦法

    這篇文章主要介紹了詳解java.lang.NumberFormatException錯(cuò)誤及解決辦法,本文詳解的介紹了錯(cuò)誤的解決方法,感興趣的可以一起來了解一下
    2020-05-05
  • Java Lambda 表達(dá)式詳解及示例代碼

    Java Lambda 表達(dá)式詳解及示例代碼

    本文主要介紹Java Lambda 表達(dá)式的知識(shí),這里整理了相關(guān)資料,JavaLambda 是Java8 引入的新功能,有興趣的小伙伴可以參考下
    2016-09-09
  • Quartz+Spring Boot實(shí)現(xiàn)動(dòng)態(tài)管理定時(shí)任務(wù)

    Quartz+Spring Boot實(shí)現(xiàn)動(dòng)態(tài)管理定時(shí)任務(wù)

    最近做項(xiàng)目遇到動(dòng)態(tài)管理定時(shí)任務(wù)的需求,剛拿到這個(gè)需求還真不知道從哪下手,經(jīng)過一番思考,終于找出實(shí)現(xiàn)思路,接下來通過本文給大家介紹了Quartz+Spring Boot實(shí)現(xiàn)動(dòng)態(tài)管理定時(shí)任務(wù)的相關(guān)知識(shí),需要的朋友可以參考下
    2018-09-09
  • Java中抽象類的作用及說明

    Java中抽象類的作用及說明

    這篇文章主要介紹了Java中抽象類的作用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • MyBatis批量插入數(shù)據(jù)過程解析

    MyBatis批量插入數(shù)據(jù)過程解析

    這篇文章主要介紹了MyBatis批量插入數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 一文帶你學(xué)會(huì)Java中ScheduledThreadPoolExecutor使用

    一文帶你學(xué)會(huì)Java中ScheduledThreadPoolExecutor使用

    ScheduledThreadPoolExecutor是Java并發(fā)包中的一個(gè)類,同時(shí)也是?ThreadPoolExecutor的一個(gè)子類,本文主要為大家介紹一下ScheduledThreadPoolExecutor使用,需要的可以參考下
    2024-12-12
  • mybatis3使用@Select等注解實(shí)現(xiàn)增刪改查操作

    mybatis3使用@Select等注解實(shí)現(xiàn)增刪改查操作

    這篇文章主要介紹了mybatis3使用@Select等注解實(shí)現(xiàn)增刪改查操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 學(xué)生視角看Java 面向?qū)ο蟮睦^承本質(zhì)

    學(xué)生視角看Java 面向?qū)ο蟮睦^承本質(zhì)

    繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類。繼承就是子類繼承父類的特征和行為,使得子類對象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為
    2022-03-03
  • Java利用Geotools實(shí)現(xiàn)不同坐標(biāo)系之間坐標(biāo)轉(zhuǎn)換

    Java利用Geotools實(shí)現(xiàn)不同坐標(biāo)系之間坐標(biāo)轉(zhuǎn)換

    GeoTools 是一個(gè)開源的 Java GIS 工具包,可利用它來開發(fā)符合標(biāo)準(zhǔn)的地理信息系統(tǒng)。本文將利用工具包Geotools實(shí)現(xiàn)不同坐標(biāo)系之間坐標(biāo)轉(zhuǎn)換,感興趣的可以了解一下
    2022-08-08

最新評論

韶关市| 哈密市| 濉溪县| 金平| 无棣县| 石阡县| 玛多县| 平乡县| 赣榆县| 贵港市| 望都县| 容城县| 繁峙县| 高邑县| 通道| 尼勒克县| 嫩江县| 汾西县| 宝坻区| 中超| 馆陶县| 繁峙县| 泾阳县| 钦州市| 舞钢市| 东宁县| 庆阳市| 扶风县| 沙洋县| 天台县| 金昌市| 汝州市| 油尖旺区| 犍为县| 鹰潭市| 横山县| 元阳县| 安化县| 巩留县| 上杭县| 屏边|