mysql的jdbc中的編碼轉換

今天,我的eclipse鏈接mysql終於又能正常地進行中文字符的操作了。

  String url = "jdbc:mysql://localhost:3306/category?useUnicode=true&characterEncoding=UTF-8";
Class.forName("com.mysql.jdbc.Driver"); 
String userName = "root"; 
String password = "***********";   
Connection con = DriverManager.getConnection(url,userName,password); 

就加了紅色的那一部分代碼就好了。我找了下面這篇博文,還算說得清楚。但也有不理解的地方,我的數據庫用的是UTF-8編碼,eclipse這個項目的text file encoding用的也是UTF-8,那麼按下文中,不加紅色部分,默認的也是UTF-8,那爲什麼對數據庫插入中文會出現亂碼呢,但顯示數據庫的中文不顯示亂碼。暫時,還沒想清,先將下面這篇博文留着,等弄明白了或找到其他解釋再來改。

轉載:

java中原生態支持unicode,內存中的String對象都是unicode編碼,對於從mysql獲取的字符串數據,理所當然需要先轉化爲unicode才能被使用,因此從ResultSet中獲取字符串列值時,jdbc需要知道當前字段的原始編碼,即從mysql-server接收到的原始字節所對應的編碼,才能正確的將其轉化爲unicode供程序使用,此文介紹jdbc是如何獲取當前字段的原始編碼的。



原始編碼的獲得流程如下:
首先,如果在鏈接字符串中設置了編碼,則原始編碼=所指定的編碼,比如:
jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=utf8
那原始編碼=utf8。


如果沒有在在鏈接字符串中設置編碼,則原始編碼=NULL,並且建立鏈接後執行
SET character_set_results = NULL
表示不希望服務器執行任何的轉換,即字段在mysql中是什麼編碼,接收到的就是什麼編碼。


如果在鏈接的使用過程中有"SET NAMES XXX",則原始編碼=XXX。


當進行ResultSet.getString()時,如果當前原始編碼不爲空,則直接將原始byte[]從原始編碼轉換成String;如果當前原始編碼未空,則用mysql返回的field信息中的字段編碼作爲原始編碼,將原始byte[]從原始編碼轉換成String。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章