mysql JDBC连接池中文问题解决_第1页
mysql JDBC连接池中文问题解决_第2页
mysql JDBC连接池中文问题解决_第3页
mysql JDBC连接池中文问题解决_第4页
mysql JDBC连接池中文问题解决_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、mysql JDBC连接池中文问题解决mysql JDBC连接池中文问题解决2011-05-10 23:52在最近的项目中使用了Mysql作为数据库,应用服务器是resin。但是在使用resin的连接池时发现中文数据保存到数据库后出现乱码,无法正确显示。我想一定是字符集不支持的原因。后来发现如果使用org.gjt.mm.mysql.Driver作为驱动的话那么只要再加两个参数就可以了,下面是web.xml中的写法:prm org.gjt.mm.mysql.Driver jdbc:mysql:/localhost:3306/prm abcm abcm但是在resin的文档中推荐使用的是JDBC2

2、.0的方式,直接使用了Mysql的连接池类com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource如果使用这个驱动上面的方法就不行了。我看了一下mysql驱动的源代码,发现这个类并没有关于字符集的设置,于是改了一下。com.mysql.jdbc.jdbc2.optional.MysqlDataSource/*Creates aconnection using the specified properties.*param props the properties to connect with*return aconnection

3、to the database*throws SQLException if an error occurs*/protected java.sql.Connection getConnection(Properties props)throws SQLExceptionString jdbcUrlToUse=null;if(!explicitUrl)StringBuffer jdbcUrl=new StringBuffer("jdbc:mysql:/");if(hostName!=null)jdbcUrl.append(hostName);jdbcUrl.append(&

4、quot;:");jdbcUrl.append(port);jdbcUrl.append("/");if(databaseName!=null)jdbcUrl.append(databaseName);jdbcUrl.append("&useUnicode=true;characterEncoding=gb2312");这一行是后来我加上的。jdbcUrlToUse=jdbcUrl.toString();elsejdbcUrlToUse=this.url;return mysqlDriver.connect(jdbcUrlToUse,p

5、rops);现在就可以使用下面的描述应用连接池了web.xml.中文可以正确显示了。但是这个方法也有一定的问题那就是不够灵活,如果能够把字符集的设置也放到参数中就更好了。prm com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource jdbc:mysql:/localhost:3306/prm abcm abcm谁说的mysql JDBC连接池不支持中文url jdbc:mysql:/localhost:3306/struts?useUnicode=true;characterEncoding=GBK 3.终于搞定了,特写一篇文章

6、来纪念一下:-)我的环境:中文简体win2000 pro+sp3 mysql server 4.0.12 j2sdk 1.4.01 connetcor-j 3.0.7问题:用jdbc插入、读取数据库种文字串乱码。首先,mysql数据库中的东西都是二进制存放的,支持任何数据,当然包括中文。你到命令行下insert into testtable values('中文');select*from testtable;全都显示正常。但是,虽然存取中文没问题,但排序、匹配的时候有问题。所以如果你的数据库里有中文的话,记得在配置文件中,如c:winntmy.ini中的mysqld里添加一行

7、:default-character-set=gbk然后重启mysql server。注意gbk要小写,不然mysqld启动不了。其次,数据库没问题,下面看看java程序。在程序里很无聊地加一句调试语句:out.println("中文");也显示正常,说明整个java环境没问题。所以,当然是联系java和mysql的部分,mysql jdbc driver出问题了。分析一下,java内部使用unicode,而mysql缺省使用iso-8xxx(忘了),所以jdbc driver把查询字符串传给mysql server时,会做unicode-iso-8xxx的转换,从mysq

8、l server接受结果时,会做iso-8xxx-unicode的转换。(在屏幕上显示结果时会unicode-GBK,不过不关这里的事。)这就有问题了,我在命令行下插入数据库的中文字符串是GBK(这是简体中文windows的默认),所以jdbc driver接受查询结果时,应该做GBK-unicode的转换才对。验证一下,对从数据库中读出的中文字串s,new String(s.getByte("iso-8xxx"),"gbk")将s先做一个unicode-iso-8xxx转换成它存放在数据库中的原始模样。我们知道它是gbk,所以手工来gbk-unicod

9、e,这样java程序就显式正常了。类似,写入数据库的时候,我们期待jdbc driver会把unicode-gbk,结果却是unicode-iso-8xxx,当然是乱码了。有很多文章,就到此为止,并告诉我们:要解决中文问题,自己手工转码吧。这实在是不负责任。如果每一个字符串都要手工转码,说明程序设计出了问题。想一想,写mysql jdbc driver的家伙会连转码都不知道?所以我看看connector-j-3.0.7里面的readme,找到一个解决方案:connection=DriverManager.getConnection("jdbc:mysql:/localhost/tes

10、t?user=root&password=&useUnicode=true&characterEncoding=GBK");这是告诉jdbc driver强制按指定参数转码其实还是有问题。如果mysql server一定得用iso-8xxx,那就只有用上一个办法了。但我记得我的mysql是gbk,不是都改过my.ini了吗?jdbc driver怎么都不自动探测mysql server的字符集呢?这个时候就看到开放源码的好处了:-)connector-j-3.0.7源码中确实有代码读取mysql server的信息,包括字符集。从注释中知道,作者为unicod

11、e转换到单字节字符集写了自己的转换函数,并号称比jvm的快百分之多少多少。所以代码中有一段,判段数据库如果使用的是单字节就调用自己的转换函数。但这段代码后面就忘了把多字节字符集交给jvm去转换了,所以变成了缺省的iso-8xxx转换。我的修改方式:commysqljdbcConnecter.java这个文件的1969行,this.doUnicode=true;/force the issue将之上移四行到1964行,放在下面这一行的前面:try用这份代码重新编出来的jdbc driver,你的java访问数据库的程序不用做任何修改就可以正确读写中文了,不过要记得mysql server要def

12、ault-character-set=gbk我使用它测试了几个小程序,中文都显示正常,而且都没死机、异常。呵呵,自我感觉很好。4.经过一番痛苦的经历,终于解决了Java和MySQL连接的中文问题了,我把经过贴出来,希望能给和我前几天一样的朋友一些借鉴。我的环境是这样,Win2000 Pro英文版SP4,默认语言是Chinese Simplified,Java SDK 1.4.2,J2EE1.4,Tomcat 4.1.27,MySQL 4.0.15-nt,JDBC:mysql-connector-java-3.0.8。问题:中文乱码。解决:JSP:%page language="java"import="jl.*"contentType="text/html;charset=8859_1"%Servlet:response.setContentType("text/html;charset=8859_1");Beans:编译的时候用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论