JDBC連線mysql亂碼異常問題處理總結

2022-09-28 01:33:10 字數 2257 閱讀 7321

前段時間學習jdbc,要連線mysql獲取資料。按照老師的樣例資料,要存一些名字之類的資訊,用的都是英文名,我當時就不太想用英文,就把我室友的名字存了進去,嘿嘿,結果,出問題了。

連線資料庫語句:

static final string db_url = "jdbc:mysql://localhost/filemanagement";

查詢語句:

private static final string theuserquery = "select name, password, role from userinfo where name = ?";

我是用我的名字做的查詢,nullpointerexception,很明顯,沒有用我的名字查到對應的資料,而資料庫中是存在的。這是為什麼呢?

百度到的答案是中文亂碼,解決方案是,修改連線資料庫語句為:

static final string db_url = "jdbc:mysql://localhost/filemanagement?useunicode=true&characterencoding=gbk";

重試!可以了!但這是為什麼呢?那兩個引數是什麼?為什麼加上之後就解決問題了?

這兩個引數解釋如下:

兩個引數的預設值都是false。也就是說我們在連線mysqsjyksxctwl的時候指定了連線使用的字符集後,一切就正常了。但我還是不太了解其中的機制,所以繼續查。

原來mysql連線進行查詢等操作時存在乙個字符集轉換過程:

1. mysql server收到請求時將請求資料從character_set_client轉換為character_set_connection;

2. 進行內部操作前將請求資料從character_set_connection轉換為內部操作字符集,其確定方法如下:

• 使用每個資料字段的character set設定值;

• 若上述值不存在,則使用對應資料表的default character set設定值(mysql擴充套件,非sql標準);

• 若上述值不存在,則使用對應資料庫的default character set設定值;

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

3. 將操作結果從內部操作字符集轉換為character_set_results。

這些character set代表什麼呢?

character_set_server:預設的內部操作字符集

character_set_client:客戶端**資料使用的字符集

character_set_connection:連線層字符集

character_set_results:查詢結果字符集

character_sesjyksxctwt_database:當前選中資料庫的預設字符集

character_set_system:系統元資料(欄位名等)字符集

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

• 向預設字符集為utf8的資料表插入utf8編碼的資料前沒有設定連線字符集,查詢時設定連線字符集為utf8

– 插入時根據mysql伺服器的預設設定,character_set_client、character_set_connection和character_set_results均為latin1;

– 插入操作的資料將經過latin1=>latin1=>utf8的字符集轉換過程,這一過程中每個插入的漢字都會從原始的3個位元組變成6個位元組儲存;

– 查詢時的結果將經過utf8=>utf8的字符集轉換過程,將儲存的6個位元組原封不動返回,產生亂碼……

• 向預設字符集為latin1的資料表插入utf8編碼的資料前設定了連線字符集為utf8

– 插入時根據連線字符集設定,character_set_client、character_set_connection和character_set_results均為utf8;

– 插入資料將經過utf8=>utf8=>latin1的程式設計客棧字符集轉換,若原始資料中含有\u0000~\u00ff範圍以外的unicode字 符,會因為無法在latin1字符集中表示而被轉換為「?」(0x3f)符號,以後查詢時不管連線字符集www.cppcns.com設定如何都無法恢復其內容了。

(此部分摘自鳥哥的blog,稍後附上鏈程式設計客棧接)

我資料庫的表都是設定的utf8編碼,但我第一次連線的時候沒有設定連線字符集,所以預設為latin1,經過了從utf8=>latin1的轉換,所以產生亂碼。我第二次用的gbk編碼,也沒用utf8編碼,為什麼也可以了呢?其實是乙個道理,中文不在latin1的編碼中可是在gbk和utf8中,所以不會出問題。

jdbc使用mysql亂碼

今天再寫jdbc web工程時,前台的引數傳到後台亂碼,根據條件查詢,如果條件是中文,就會返回null,很是影響操作啊,新增資料時就出現下面的亂碼情況 jsp前台顯示 mysql顯示 解決方案 string url jdbc mysql localhost 3306 mydb2?useunicode...

jdbc連mysql亂碼問題

昨天晚上蹦出來這麼個bug,趕緊解決一下,為了資料庫課程設計突擊jsp,還真是遇到了不少問題。就像前面講的mysql我用的utf8mb4 unicode ci,那麼,亂碼產生的主要原因是字元編碼 characterencoding 不正確 1 在資料庫伺服器上建立 時沒有選擇支援中文的編碼方式 2 ...

jdbc遠端連線MySQL

匯入乙個jar包 好像mysql 8以上版本需要這個新的 但是我這裡好像兩種都可以,我的mysql是5.7的 所以用了 這個是我在其他網上查閱到的有不同的地方,但是我發現5.7的兩種都可以,只要jar包對應就好。mysql 8.0 以下版本 jdbc 驅動名及資料庫 url static final...