写在前面的话

在测试搜索时出现的问题,mysql通过中文查询条件搜索不出数据,但是英文和数字可以搜索到记录,中文无返回记录。本文就是写一下发现问题的过程及解决方法。此bug在第一个项目中点这里还存在,修改后的maven项目中点这里此问题已经修复。

问题定位过程


打开项目地址,进入书籍信息管理

初始化的时候,回传的结果是所有数据进行分页后的信息记录,这里可以看到书名为中文的记录,但是通过搜索栏的标题栏进行搜索的时候,问题出现了,如下:

没有返回数据!一开始我是没有注意到这是个bug的,因为刚开始整合,很多页面的js都有些错误还没改,所以我感觉可能是js出了问题,就重新看了一下本页面的js方法,没有错误。然后就试着用英文和数字进行搜索,得到如下结果:

都有结果返回,又尝试着用其他中文参数进行查询,依然没有数据返回。打开控制台查看后端返回的结果,如图:


后端没有报错,只是返回了空数据。到了这一步,已经可以清楚问题出在哪里了,就是中文乱码问题,导致传入数据库的参数不正确,因此无法查出数据。那么中文乱码是出现在哪个步骤里呢?因此又开始继续定位问题,首先是查看http请求,是否在请求时就已经出现中文乱码的问题,打开控制台,得到如下结果:


请求头中的title字段依然为中文字段,并没有乱码。那么中文乱码就不是在前端出现的,可能是数据库编码或者后端代码出现了错误导致这个问题。登录数据库查询数据库编码,如图:

切换到当前数据库,查询数据库的编码格式,结果为utf8,数据库编码格式也是正常的,通过数据库管理工具执行如下sql也是可以查询到结果的:


所以问题就一定出现在代码或配置中,导致程序通过jdbc与mysql间的查询出现中文乱码。查询程序输出日志,如图:

整理后:


通过跟踪程序日志发现传入的中文参数一直到dao层都没有乱码,但是查询的结果却出现了差错,问题就是jdbc连接了。
详细解释可以参照前文Spring+SpringMVC+MyBatis+easyUI整合基础篇(七)JDBC url的连接参数处理过程总结:发现查询bug,定位问题,是否为前端js错误?是否为http请求时已经中文乱码?是否为后端http返回报错?是否为数据库编码错误?是否为程序传参乱码?是否为jdbc连接错误?通过这一系列问题的提出与验证,最终定位到问题并解决。看到这一过程,步骤挺多的,可能有人会说,不就是一个中文乱码问题吗,至于啰啰嗦嗦讲一大堆吗?我呢,只是记录一下bug修复的过程,及过程中遇到的小麻烦,这些都需要一一去落实的,不然怎么知道是不是js的错?是不是http请求传参时就已经乱码?是不是数据库编码格式真的不是utf8......虽然步骤有些多但是有些问题其实只需要简单的验证即可知道结果,重要的是细心和耐心,发现了问题就要解决,要去解决就不能怕麻烦,也不能怕找不到问题,无非是你的决心和方法,而且碰到的多了,自然而然定位问题就会快很多,共勉。

结果

通过jdbc与mysql数据库建立连接时,如果数据库的编码格式为utf8,那连接的URL也应该为UTF-8的形式传递参数到数据库才不会出现乱码,为了减少乱码,
建议数据库的连接和传递的参数的编码一致,详细如下:
jdbc:mysql://localhost:3306/ssm_demo_db?useUnicode=true&characterEncoding=UTF-8



tip:最近开发任务慢慢增多,暂时就不更新了。

更多相关文章

  1. Mysql基础之字符集与乱码
  2. mysql中插入中文时显示乱码
  3. 关于mysql无法添加中文数据的问题以及解决方案
  4. Js的Url中传递中文参数乱码,如何获取Url中参数问题
  5. js 处理url中文参数 java端接收处理
  6. Javascript警报中文本的颜色
  7. 自学Python1.5-Centos内python2识别中文
  8. Python2基础用法(中文编码,标识符,注释)
  9. Python 用hashlib求中文字符串的MD5值

随机推荐

  1. Android图表控件MPAndroidChart——曲线
  2. android与j2me移植之clipRect
  3. Android(安卓)文件系统获取root权限
  4. Android Studio 获取SHA1
  5. android使用Glide加载RelativeLayout、Li
  6. android UI小结(一)
  7. 安装Android SDK出现Failed to fetch URL
  8. LinuxMint下让adb工具识别android设备
  9. Android 众多的布局属性详解
  10. 断点下载