ITPub博客

首页 > 数据库 > MySQL > Ubuntu下JDBC+MySQL5.0乱码问题的解决过程

Ubuntu下JDBC+MySQL5.0乱码问题的解决过程

MySQL 作者:cgnlfssa 时间:2013-06-19 17:06:00 0 删除 编辑

 

  Mysql是默认安装的,为了练习,准备在Sqlserver下的数据库迁移到Mysql中。然而一开始就碰壁了,中文全部进不去。Google了一番,从配置文件下手。Ubuntu的很多配置文件都放在/etc下对应的文件夹,顺利找到了/etc/mysql/my.cnf,按照教程,加上了default-character-set=utf8,保存,重启mysql,未果,开始思考。先从症状下手,刚开始是在mysql命令行里操作,插入中文数据的时候出现乱码。想着肯定是数据库的问题,配置的问题,只是修改了配置文件没有效果令人很困惑。刚开始以为是自己找错了配置文件,花了n多的时间google和搜配置文件,利用mysql配置工具找参数,折腾了好几次,仍然无果。朋友帮我看了下,也无果,人家明明就是好的,为什么我的就不可以呢?然后开始从数据库本身着手,查阅手册得知可以在建立数据库和表的时候指定编码的参数。于是按照语法加上对应参数,有进展,用命令行可以插入正确,只是jdbc的操作仍不争气,极度郁闷。两个小时就这么过去了。又开始思考,没有结果,呵呵,再次google,发现了可以在连接字符串指定数据的编码,做了尝试,哈,第一次在Java控制台看到漂亮的中文。看来数据库和表创建时的参数已经产生了效果。可是,难道真的每次都需要指定连接字符串的编码并在创建的时候指定编码,很显然不太爽。又是google一番,找到了一个可以查看编码的相关命令:show variables like 'char%'。其实还是自己见识太少,如果早知道这个就不会走这么多弯路了。刚开始的时候,命令给出的结果都是latin1,而我期望的是utf8。这时候才真正感觉到一定是自己的配置文件的参数加错了。回头查阅mysql如何设置默认编码,才猛然发现自己真的是太粗心了,我没有把编码选项加到对应的选项组,当然不会产生效果。按照网上的说明,在mysql选项和mysqld选项中加上对应选项,保存,重启服务,再用show variables like 'char%'看时已经是utf8了。撤掉jdbc连接字符串,建库建表的脚本中关于编码的选项,重新测试,结果出来了,哈,总算可以安心下班了。

  整理下实现的过程:在控制台测试中文,数据进不去(命令行报错,而且进去后全部是?),想到默认编码是latin1,开始改配置文件。但是因为配置文件改的是错误的格式,没有效果,误入歧途。工具命令试验无数,未果。找到建库参数,实现控制台的中文数据操作(这时候命令行不再报错误了),只是jdbc还是问题。找到了jdbc连接串的参数后得出结果。在成功的激励下再次找配置文件的写法,得出正确的结论。

  问题是解决了,总结还没写呢,自己走了很多弯路,对很多东西作出了怀疑。一方面自己的细节注意不够,错过了很多细节,另一方面经验问题,耽误了很多时间。下次我肯定会更加重视配置文件本身,呵呵,尤其是要看清楚文件的格式。linux很多东西都没有windows下那么方便,windows下的那个设置向导是可以直接选择编码等这些参数的。但是 linux给了我们更多的学习空间,这也是一种享受哦。

  另外通过一番搜索,对mysql的编码体制也有了一些新的体会,记录下,和大家分享。

  在网络上查阅资料的时候看到有的网友甚至提问如何将中文转换为ascii码存储,我自己也有过这样的想法,但是从性能,兼容等方面来说,完全是错误的想法。转码总的来说是费时间的,而且转码后搜索就成了问题。其实只要搞清楚mysql对中文等国际语言的支持,问题就很容易解决。mysql的编码分成很多层次,我的理解可以在各个层次上支持。最基础的层次是可执行文件的版本,然后是启动服务的时候的配置,再是创建数据库和数据表时候的选项。而且这些参数都有传递性,可以这样来理解:如果建表或者建库的时候我们没有指定编码(绝大多数的时候是这装样子的),系统会自动继承服务器启动的参数配置;如果服务器启动的时候没有指定编码,这时候系统会自动继承可执行文件的默认编码,在我的机器上就是如此,初始状态下没有任何编码。由于ubuntu发行版的“国际背景”,其可执行文件件的版本应该是英文字符集,毕竟linux在欧洲非常流行,呵呵。这样,在我没有任何配置之前,数据库和表都是以latin1的编码存储的,无法存储中文也就可以理解。后来我在创建表和库的时候加上了对应的参数,数据库和表的编码不再继承默认的latin1,所以可以存进去中文。为什么现在jdbc还是不行(这里耽误的时间最长)?这就涉及了编码问题的第二个方面:不同的子系统的编码问题。由于服务器启动的参数仍然选择了latin1编码,连接,结果集,以及插入数据时的字符串仍被处理成“乱码”。而通过在连接的时候指定jdbc连接字符串的参数能很好的沟通服务器和jdbc驱动,也就顺利解决了问题。但是如果我们给服务器加上启动参数,服务器启动的时候数据参数就会系统更改,和jdbc打交道的时候也就不会有问题了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21751993/viewspace-1108951/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-05-27