原因是:
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
解析。