java讀寫Mysql數據庫亂碼

寫代碼又遇到了萬惡的中文亂碼問題,比較奇怪的是server上已有的代碼,在鏈接時通過"useUnicode=true&characterEncoding=gbk"轉碼後無亂碼,但在本機上使用同樣的代碼讀寫得到的確實中文亂碼。數據庫是遠程server,環境不能改動,在網上搜到的大部分方法都是抄來抄去且不能解決實際問題的方法。所幸搜了半天還是找到了一個。查看server數據庫編碼,執行sql:“ show variables like 'char%'; ” 得到各種字符編碼如下:

character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

可知:mysql使用的是Latin1字符集,那麼下面的問題就是怎樣在java端把從數據庫中讀取出的內容轉爲Latin1編碼了搜索一番後找到下面的內容。

【以下是搜到的內容,原文網址:http://ghostgate.blog.163.com/blog/static/20570131200811442747326/】

MySQL默認使用 ISO-8859-1 ( 即Latin1 ) 字符集,而JAVA內部使用Unicode編碼,因此在JAVA中向MYSQL數據庫插入數據時,或者讀取數據時,都需要先轉換一下編碼方式:

插入數據

如:
...
String str="中文";
String sql = "insert into Tb (xxx) values (?)"
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,str);
pstmt.executeUpdate();
這樣插入到Mysql數據庫後,用mysql.exe連接查看數據可以看到,插入數據變成了幾個“?”呈,也即成了亂碼。

解決方法是:

String str="中文";
str = new String(str.getBytes(),"ISO8859_1");         //加入此句,改變編碼爲iso-8859-1
String sql = "insert into Tb (xxx) values (?)"
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1,str);

pstmt.executeUpdate();

 讀取數據:
 方法與插入數據類似,如下:
...
String str = rs.getString(1);
str = new String(str.getBytes("ISO8859_1");     //由ISO8859-1編碼還原爲JAVA內部默認字符集
//或者 str = new String(str.getBytes("ISO8859_1","GBK");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章