关于解决mysql和jsp乱码问题的总结问题的本质是:应用程序采用的字符集与数据库(mysql)采取的编码集不一致。
关于解决mysql和jsp乱码问题的总结
问题的本质是:应用程序采用的字符集与数据库(mysql)采取的编码集不一致。产生问题的关键原因是,我们都是在基本功能做完后才去解决乱码问题,因此,按照网上大多数人介绍的方法,去修改数据库配置文件my.ini,通过指令直接去修改数据库或者表的字符集,都没有生效。后来,尝试在上述方法后新建一个表,发现问题解决,又查到,可以通过mysql> ALTER table tablename modify 字段名 varchar(100) CHARACTER SET gb2312;来强制指定现有表格的某些字段的字符编码集,总算解决了所有问题。
?
前两天项目中遇到mysql乱码的问题,折腾了好几天,查了好多资料,最后在恍然大悟中解决了。今天先简单的说说这个事,然后把在这个事中查找学习到的心得记录下来,以与大家分享,亦备后用。
四.怎么在程序里查看客户端发送给服务器的SQL使用什么编码呢?
在客户端写个程序,执行SQL语句:public void test() 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://192.168.0.10:3306/test?useUnicode=true&characterEncoding=utf-8 这样的配置。结果用test()方法查询结果如下:
character_set_client,latin1character_set_connection,latin1character_set_database,utf8character_set_filesystem,binarycharacter_set_results,character_set_server,latin1character_set_system,utf8character_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,utf8character_set_connection,utf8character_set_database,utf8character_set_filesystem,binarycharacter_set_results,character_set_server,latin1character_set_system,utf8character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
第一行为utf-8,SQL将用UTF8打包给Server,Server也用Client配置的UTF8解析。
