devil4heaven
发贴: 11
积分: 0
|
于 2004-04-03 11:21
最近准备更换一个Oracle部分表格到Mysql,正在进行相关测试工作,一个明显问题就是字符转换问题,一个下午的时间搞定之,解决方式如下:
Server: RHAS3 updte1+Mysql 4.0.18(bin方式安装,默认字符为latin1,同时支持其它字符集GBK等等),RHAS3 安装语言为US_EN Client测试: 创建用户后,远程(win2k3 CN)mysql -h 192.168.10.x -u test -p连接后,show status,显示server端字符集为latin1,create table test(chinese varchar(100)),插入中文数据insert into test values('中文'),select查看中文正常,通过mysql客户端连接使用中文正常 jdbc测试: RHAS3+Tomcat4.1.30+Sun JDK1.4.2_04,系统默认语言US_EN,使用mysql Connector/J,版本为3.0.11-stable,注意这是mysql官方网站提供的最新jdbc驱动,利用Tomcat自带的DHCP1.1,建立JDBC DataSource,连接url为 jdbc:mysql://localhost:3306/test?autoReconnect=true,然后简单的jsp post提交简单中文,中文转换(jsp打印正常),连接数据库,写入mysql,成功,用mysql client连接后再查看,已经是乱码了! 以为是mysql字符的问题,然后更改/etc/my.cnf,添加 default-character-set = gbk,重新启动mysql,此时数据库默认字符为GBK字符集,重复上面的jdbc测试,这次简单中文正常了 但出来个新问题,对于稍微长一点的中文字符post提交后,居然出exception,java.lang.StringIndexOutOfBoundsException错误,而且只要中文字符超过2个,就出现以上错误,检查编译后java源码,开始怀疑是jdbc drive的错误,上http://bugs.mysql.com,最终得到的结果如下http://bugs.mysql.com/bug.php?id=3288,的确是Connector/J 3.0.11stable的bug,到http://downloads.mysql.com/snapshots.php下载最新的jdbc Driver驱动,安装再次测试,中文正常,测试text字段,大长度中文插入显示均已经正常。
总结:mysql bin package安装后,默认字符集为latin1,此时最好更改其为GBK,JDBC连接时,还是建议使用最新的Mysql官方驱动(别用3.0.11stable),毕竟旧的MM Mysql驱动已经不被支持了,这样JDBC只要写入mysql时转码一下即可,以后从数据库里用JDBC、Mysql Client等读取中文数据都不用再次转码。用惯了Oracle,习惯在sqlplus里直接看到中文数据
|