设为首页 收藏本站
查看: 576|回复: 0

[经验分享] 终于解决了mysql的中文编码问题。

[复制链接]

尚未签到

发表于 2016-10-17 09:30:50 | 显示全部楼层 |阅读模式
  以前在用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.iyunv.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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-287278-1-1.html 上篇帖子: mapreduce处理结果向输出至mysql(直接插入/更新/追加式更新) 下篇帖子: AJAX JSON-RPC + MYSQL 数据库登陆和查询操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表