刚刚修我们鱼聪明 AI 帮手渠道的一个 Bug,结局很狗血!赶忙给我们共享一下,顺便也共享下标准的排查 Bug 思路。

事情是这样的,有小伙伴在鱼聪明渠道(www.yucongming.com)创建了一个 AI 帮手,名称为【软件开发人员】。当我查找 “软件开发” 时,能搜出这个模型:

写了 7 年代码,第一次见这么狗血的小 Bug!

成果查找 “软件开发人员”,也便是帮手的全名称时,居然搜不出成果了?!

写了 7 年代码,第一次见这么狗血的小 Bug!

遇到这种事,先从前端出发:第一时间确认前端发送的恳求参数是否正确。

按 F12 打开网络控制台,发现查找关键词传的没缺点:

写了 7 年代码,第一次见这么狗血的小 Bug!

然后鱼皮顺着网线爬到后端,先要确认一下从数据库中有没有查出最原始的数据,再考虑是不是被业务代码过滤掉了。

在本地敞开数据库的查询日志,用的是 MyBatis Plus 框架,敞开日志的代码如下:

mybatis-plus:
  configuration:
   map-underscore-to-camel-case: false
   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

再次履行查找,打印出的 SQL 记载如图:

写了 7 年代码,第一次见这么狗血的小 Bug!

把参数拼到 SQL 句子模板中,便是 name like ‘%软件开发人员%’,看上去没有任何问题。

再次验证,接下来我们把拼接好的 SQL 放到数据库控制台进行实在查询:

写了 7 年代码,第一次见这么狗血的小 Bug!

成果查询成果为 0:

写了 7 年代码,第一次见这么狗血的小 Bug!

奇怪了,莫非数据库中没有这条记载?但是为啥查找 “软件开发” 的时分,能搜出这个帮手呢?

然后我又用帮手的 id 去数据库中查询,发现确实有名称为 “软件开发人员” 的数据。

写了 7 年代码,第一次见这么狗血的小 Bug!

气了气了,为啥查不出来啊?!我们也能够猜一猜。

这个时分我其实已经有想法了,莫非是数据库中存储的 name 和我们看到的 name 格局(或者字符)不一致?所以我就从数据库中把 name 的值仿制出来,如图:

写了 7 年代码,第一次见这么狗血的小 Bug!

成果,从数据库中仿制出来的 name 作为查询条件,是能查出成果的!

所以就有了下面这张神奇的截图,两个 “一模一样” 的 SQL 句子,一个有成果,一个没成果:

写了 7 年代码,第一次见这么狗血的小 Bug!

基本就能够确认了,此 “软件开发人员” 非彼 “软件开发人员”,这两个字符串是不一致的!

所以我分别用这两个字符串来生成 MD5 Hash 码,发现 Hash 码不同,阐明原字符串不同。

写了 7 年代码,第一次见这么狗血的小 Bug!

再进行更精确地比照,发现是 “人” 字不同:

写了 7 年代码,第一次见这么狗血的小 Bug!

坑啊!谁能看出来这两个 “人” 字有差异!

到底有啥差异呢?问下鱼聪明 AI 吧~

写了 7 年代码,第一次见这么狗血的小 Bug!

成果一秒破案:原来第一个 “人” 是全角字符,这真的是。。。泰裤辣!

大概整个案子便是这样。所以说,我们看到得未必是实在的,这个 Bug 让我想起了很多朋友初上大学时经常把中英文逗号、中英文冒号搞混,这种 Bug 真是让人哭笑不得。希望各位程序员朋友们,尽量不要遇到吧,遇到了的话,想想我这篇文章,说不定就有了处理的思路呢。

鱼聪明AI – 做您强壮的AI帮手