终于解决了mysql的中文编码问题。

以前在用Struts时遇到过一次,当然用在url之后加characterEncoding=gbk&useUnicode=true的方法搞定了,不过也不知为什么,后来在别人的机器上却出了问题,原因不详。后因隔得太远,远程连接又太慢,不了了之、、

后来在最近的一个项目中,也遇到这个问题,两台机器:同样的系统装着同样版本的软件与driver,可就是有一台机器行,有一台机器不行,郁闷了很久,不过那个项目中,并没有使用hibernate,而是用了最原始的DAO模式的实现方法,自己组装SQL语句,所以在查询前将sql语句转一次码(gbk->iso),然后在将从结果集的中的字符串再转一次码也能(iso->gbk)搞定,这也算是一个笨笨的解决方案了。

可是现在考虑用hibernate来做这一个项目的第二版本,自然也还是遇到了这个中文编码的问题,如果不解决,那要在对bean的设值时做一次转码,在hql的语句中也需要转码,然后得到的bean的属性取值时也要再做一次转码,这样的代码让人心烦(如果用AspectJ来织入部分转码,但是总让人觉得古怪),如果要是这样,我宁可不去用这个hibernate、、、结果在网上关于这个问题的资料并不算多,而且台湾那边讨论的比国内的要多一些,按照相应的方法试过之后,都不行。都让我怀疑,我自己是唯一被这个问题困扰的霉蛋了,差点决定去重编译mysql和去改写JDBC的源码。

不过robbin的一个总结http://forum.iteye.com/viewtopic.php?t=10522&postdays=0&postorder=asc&start=0让我看到了一点希望,然后抱着最后一点希望一点点的用各种方法尝试,终于找到了我自己的一个解决办法。

现在想来其实也算简单,总结如下:

1)将my.ini中的默认字符集latin1改为gbk并[client]之后加入一条default-character-set=gbk,然后关机重启

2)重启之后,打开mysql CC看到以前表中的中文都变成了???之后的乱码。这个是很正常的,因为以前的表中的字符都是使用的ISO8859-1的编码方式,你现在用了GBK编码方式来显示自然是乱码。这时我们需要重建一张表,并使用默认的字符集GBK。我的作法是用它的show create的语句,将其中的字符集改成gbk,并修改表名,来再建一张表,然后写一段JAVA程序将原表中的数据,从ISO编码转到GBK编码之后导入到新表之中,并将原来表drop掉,将新表换成原表的名字。(其实我也不知道,mysql中有没有相应的sql语句或方法能将直接将数据的编码转过去,如果有人知道请告诉我)这时表中内容在mysql CC与query browser中显示的就是正常的中文了。

3)然后、、没有然后了,你现在就可以在程序中用正常的方式来使用中文了,我用JDBC与hibernate测试都通过了,就象再也没有转码这个问题存在了一样,而且也连带着解决了ISO编码中文排序的问题。只是在命令行的环境下GBK编码的中文显示的是乱码。这个是XP命令行方式用的是ISO编码的问题(至于怎样的修改,我也不知道,如果有人知道请告诉我)

这次尝试给我的经验是,最好一开始建库时就用GBK编码,然后在里面加入的数据就会是GBK的编码,这样也就不会遇到我所遇到的一切麻烦了。

最后还是引用robbin的总结吧,现在看来他真是讲得太好了,只是在我没有解决这个问题之前,觉得讲得不足够详细:P

因此,使用什么数据库版本,不管是3.x,还是4.0.x还是4.1.x,其实对我们来说不重要,重要的有二:

1) 正确的设定数据库编码,MySQL4.0以下版本的字符集总是默认ISO8859-1,MySQL4.1在安装的时候会让你选择。如果你准备使用UTF- 8,那么在创建数据库的时候就要指定好UTF-8(创建好以后也可以改,4.1以上版本还可以单独指定表的字符集)

2) 使用3.0.16以上版本的JDBC Driver,那么你就不需要再写什么characterEncoding=UTF-8

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值