Spring+SpringMVC+MyBatis+easyUI整合基础篇(八)mysql中文查询bug修复

前言

  在测试搜索时出现的问题,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:最近开发任务慢慢增多,暂时就不更新了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

面试分享系列 | 17道Python面试题,让你在求职中无往不利

今天给大家分享的是Python面试题系列的第一篇文章,后续我也会陆续整理Python相关的问题给大家,无论是求职者还是新人都可以通过面试题来考察自己的能力缺陷。...

3584
来自专栏微信公众号:Java团长

深入理解Java I/O系列一:File

I/O问题可以说是当今web应用中所面临的的主要问题之一,大部分的web应用系统的瓶颈都是I/O瓶颈。这个系列主要介绍JAVA的I/O类库基本架构、磁盘I/O工...

961
来自专栏西枫里博客

thinkPHP5模版页面volist循环offset不能使用变量

有这样一个应用场景:当volist循环需要排除前面几个数据的时候,我们通常使用offset来操作。而假设前面要排除的数据是根据当前页面占位符来确定的,而需要排除...

822
来自专栏数据库

详解Redis内部运作机制

纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注。 Linux技术交流QQ群:2659793(十二月最新!!) Redis数据库(Red...

2177
来自专栏林德熙的博客

win10 uwp 应用转后台清理内存

我在写小说阅读器,把每个打开的文件的内容读到内存,因为小说都很小,所以放在内存不怕太大,但是我如果打开了一本小说,再打开一本,我不会把先打开的小说的内容清除掉,...

1172
来自专栏我是攻城师

给Java字节码加上”翅膀“的JIT编译器

上面文章在介绍Java的内存模型的时候,提到过由于编译器的优化会导致重排序的问题,其中一个比较重要的点地方就是关于JIT编译器的功能。JIT的英文单词是Just...

1175
来自专栏瓜大三哥

Matlab基本语法7

基本编程技巧 脚本m文件和函数m文件,脚本是一系列命令、语句的简单组合。脚本文件中的变量都是全局变量,程序运行后,这些变量保存在matlab的基本工作空间内,一...

2469
来自专栏指尖下的Android

Android4.4运行过程中闪退java.lang.NoClassDefFoundError

上周五项目测试时发现一个奇怪的Bug,项目中依赖了一个第三方框架,但是在android4.0-4.4.4之间的系统中运行会直接闪退,抛出错误异常为java.la...

1132
来自专栏老马说编程

(56) 文件概述 / 计算机程序的思维逻辑

我们在日常电脑操作中,接触和处理最多的,除了上网,大概就是各种各样的文件了,从本节开始,我们就来探讨文件处理,本节主要介绍文件有关的一些基本概念和常识,Java...

2035
来自专栏风中追风

java类的加载过程和类加载器的分析

我们知道,我们写的java代码保存的格式是 .java, java文件被编译后会转换为字节码,字节码可以在任何平台通过java虚拟机来运行,这也是java能够跨...

5468

扫码关注云+社区

领取腾讯云代金券