2007年10月12日

    我以前遇到tomcat+mysql5中文乱码时都是去网上找解决办法,解决了后就不去深究原因,现在我总结一下:

  1:关于

        Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"

与    Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"

写法的要注意的地方,& 是 & 的转义符号,两种写法都是正确的,只是下面的写法用在xml配置文件中,而上面的用在java代码中。

2.查看客户端发送给服务器的SQL使用什么编码

如果你的jsp或者java代码发送给mysql的中文是乱码,你可以运行一下下面的代码,看看客户端发送给服务器的SQL使用什么编码;

private static String ClassName = "org.gjt.mm.mysql.Driver";
private static String Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
private static String UserName = "root";
private static String PassWord = "";

Connection con = null;
 try {
     Class.forName(ClassName).newInstance();
     con = DriverManager.getConnection(Url, UserName, PassWord);
 } catch (Exception e) {
     e.printStackTrace();
 }
 
ResultSet rs = con.createStatement().executeQuery("SHOW VARIABLES LIKE ‘character_set_%’");
   while(rs.next()){
      System.out.println(rs.getString(1) +","+ rs.getString(2));
   }
rs.close();
con.close();

没有配置characterEncoding=utf-8之前,我使用的是 Url = "jdbc:mysql://localhost:3306/test;
这样的配置。结果用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
解析。

部分类容来自 - http://www.master8.czm.cn/data/2007/0308/article_5458.htm