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