程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> Mysql5寫中文亂碼問題解決

Mysql5寫中文亂碼問題解決

編輯:關於MYSQL數據庫
我插入MySQL5的中文一直是亂碼。
但是直接使用MySQLAdmin,EMS等工具插入DB就不是亂碼。而且我還可以使用程序正常地讀出來。

原因是:
DBDriverClass=com.MySQL.jdbc.Driver
DBURL=jdbc:MySQL://10.4.2.52:3306/srx?useUnicode=true&characterEncoding=utf-8
這樣的URL中useUnicode=true和characterEncoding=utf-8兩個屬性都不好用。

所以,數據庫服務器無法從URL中獲知ClIEnt使用了哪個編碼。於是就使用數據庫服務器上默認的latin也就是iso-8859-1編碼來解析用戶發送的sql語句。這樣,原本用戶是用操作系統的編碼,但是服務器硬給轉成ISO-8859-1,所以就亂碼了。

ClIEnt端只要配置好
useUnicode=true
characterEncoding=utf-8
這兩個屬性。只要指定了,就不會亂碼。utf-8可以,gb2312可以,gbk可以。指定了什麼,ClIEnt就默認以這種
編碼轉換SQL語句,服務器也就知道怎麼轉會去。


怎麼看客戶端發送給服務器的SQL使用什麼編碼呢?

在客戶端寫個程序,執行SQL語句:
public void select() throws SQLException {
        ResultSet rs = this.cnn.createStatement().executeQuery("SHOW VARIABLES LIKE 'character_set_%'");
        while(rs.next()){
            System.out.println(rs.getString(1)+","+rs.getString(2));
        }
        rs.close();
    }
沒有配置characterEncoding=utf-8之前,我使用的是DBURL=jdbc:MySQL://10.4.2.52:3306/srx?useUnicode=true&characterEncoding=utf-8 這樣的配置。結果用select()方法查詢結果如下:

character_set_clIEnt,latin1
character_set_connection,latin1
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/MySQL-standard-5.0.27-Linux-i686/share/MySQL/charsets/

注意第一行就可以了,可見使用的是latin1。

而latin1本身就無法表示漢字,經過這個編碼打包的SQL語句發給Server,Server也用Latin1解析也無法還原。

所以,我總是寫亂碼到DB。

而配置了配置characterEncoding=utf-8之後,
執行select(),結果:
character_set_clIEnt,utf8
character_set_connection,utf8
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-Linux-i686/share/MySQL/charsets/

第一行為utf-8,SQL將用UTF8打包給Server,Server也用ClIEnt配置的UTF8
解析。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved