zoukankan      html  css  js  c++  java
  • “云擎”中云数据库的乱码的解决方案

    前段时间在京东云擎Jae平台发布一个Java Web应用碰到了中文乱码问题,通过与Jae开发团队沟通和交流后发现主要因数据库编码与应用的字符集不一致造成,现在问题已得到顺利解决,考虑到其它开发者可能也会遇到类似的情况,现在就把问题的出现和分析解决过程分享总结一下,帮助以后的开发者再遇到类似情况知道如何处理.

    应用发布 

      今年4月初我在京东云擎jae云擎注册了个人帐户,得到了2G内存,以及20个应用的资源空间,另外还得到了总共25G的数据库空间,免费版的mysql实例套餐是5G,正好我的应用会用到中使用的mysql数据库,那好就试着创建了一个,本以为比较麻烦,结果就只需要点“新建数据库”,然后再选择数据库类型,就很快创建了一个,挺方便的,还不错,不过实例是建好了,不过怎么使用我呆会再说。 现在说重点,发布应用。创建了数据库之后我在 jae的应用控制台创建了一个java应用实例, 这个实例是通过模板创建,它创建后建可即访问,不过只是个欢迎页面,表示应用跑起来了,并且可以提供对外访问,仅此而已,没有实际的功能,具体的功能代码还得自己加,由于想快一点把应用放上去看看效果,我没有把本地的代码上传到应用对应的代码库中,而是直接用它war包上传功能。

                我首先把应用在本地调试了一下,确保能本地正常运行,然后打成war包,说明一下我的应用是maven来构建的,只要在工程pom所在的路径下执行 mvn clean package命令就把工程的war包打好了。 jae提供的直接上传war包发布的功能其实挺方便的,只要在jae应用管理控制台选中要发布的应用 --->"部署管理"--->“上传war包署”,我在对话框中选择之前maven生成的war包,确认之后就开始上传。

    顺便说一下,上传所需时间根据包大小和网络带宽而定,war包上传过程中不要关闭对话框,否则会中断本次上传任务。对于大的工程序还是通过代码托管理比较好。上传完成之后应用被重新发布,所有操作都在管理控制台的日志窗口实时输出,看起来很直观,

    很快提示我可以访问应用了,点击url,很快出现了我应用的登录介面,到目前为止一切进展得挺顺利, 但内心却有点隐隐的不安,果然在输入完登录帐号和密码后报错了,没连上数据库,这时候才想起应用的连接京东云数据库的参数没改,而且初始数据也没有导入。

    数据连接参数配置

        说明一下,第一次用户jae云数据库的同学可能有疑惑,不知怎么连,主要有两步,第一步:参数获取,这个简单,只要在jae应用管理中的云数据库菜单下找到你要连接的数据库实例,点击实例名称,就会弹出如下对话框,其中就有关键的数据库参数,

    第二步: 根据这些参数我把我应用中的数据库配置文件作了相应的修改,然后重新把应用打包。

    数据初始化

     Jae提供了一个开源的云数据库管理工具adminer。通过点击数据库客户端链接即可进入,数据导入有两种方式,一是直接在sql命令文本框中输入(每条sql语句用";"分隔);第二种方式是上传sql初始的脚本文件导入。数据初始化完成后可以在sql命令框中,输入show tables,检查表是否已创建,通过select查看数据是否已在表中。数据验证完没问题之后我重新上传改了数据库连接的war发布。

    中文乱码问题

      应用重新发布正常启动后,再次登录,这次成功进入到应用的主介面,但是很快发现菜单全是乱码,心中顿时一凉,

     

    应用的菜单是从数据库中读取出来的,难道数据库中的数据不对?我于是回到adminer中查看了一下menu表中的数据中文是正常的, 但为什么在应用户却是乱码,我应用中java代码和jsp都是用utf-8编码,云数据库的字符集编码也是utf8,我应用中用到了hibernate3.x与数据库相关的配置中也明确指定了utf8,但最终显示的菜单中文是乱码实在太诡异了。

    后来就在adminer的sql命令框中输入show variables like 'character_set%';得到如下输出

     

    这说明adminer连接mysql字符参数是"latin1",而不是utf8,这与我应用的连接数据库的方式不同。为了进一步证实我应用实际创建的数据库连接状态,与jae开发团队取得了联系,并得到支持,我把我的数据库参数信息发给他们,他们从云主机上直接通过mysql客户端连接我的数据库后,得到的当前会话Session

    的编码信息如下

     

    查看菜单表中的数据果然也出现乱码,如图

     

    这与我应用遇到的情况一样,现在问题逐渐清楚了,是由于adminer管理工具连数据库用的默认是latin1字符集,那么在数据导入时,中文被按latin1编码格式存储,在adminer查询数据时也是按latin1解码所以看到中文都是正常的

     

    但是我的应用是按utf8来解码(与存储时用的utf8不一致),所以在应用的页面中文出现乱码。

    乱码解决

    知道问题的所在解决方法一般有多种,我由于不想改变应用的源代码中的数据处理逻辑,那么就从数据本身入手,就是由于有数据初始化脚本,重新按utf8编码格式来初始化数据很简单 。操作如下,

    1.  清空含有中文字符的表,delete,truncate都行,

    2.  用adminer导入时,需要改变当前session的字符编码格式为utf8,即在脚本开始执行 set names ‘utf8’

     

    3.  导入完成之后,应用不用重新部署和重启,我登出后重新登录,现在菜单果然正常显示中文了

     

    现在应用没有问题了,后面经验证,新录入的中文信息也是正常的。但是正当我以为一切ok时回到adminer工具想看看数据表中的数据时,一件意想不到的事件出现了,现在adminer中看到的中文变成了乱码。

     

    根据之前的分析,中文数据本身在数据库中没有问题,只是从数据库读出来解码格式不对,所以才会这样,处理这个问题很简单,因为之前说过adminer默认是用latin1字符集来编码和解码,只要在select之前加用 set names 'utf8' 指定用utf8字符集就正常了

     

    这其实是adminer工具的问题,这样的操作还是有点麻烦,最好是让adminer在连接数据库以及操作数据库时默认用utf8事情有简单多了。希望jae的开发团队能尽快修复这个问题,为开发者提供一个方便好用的数据库管理工具。

  • 相关阅读:
    Rest
    docker-4
    Arrays.asList
    docker-3
    docker
    docker
    linux-ss
    jackson
    Java将图片的路径转为Base64,VUE前端显示
    java base64视频存到本地或服务器
  • 原文地址:https://www.cnblogs.com/cloud_china/p/3803796.html
Copyright © 2011-2022 走看看