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

26,693 阅读3分钟

刚刚修我们鱼聪明 AI 助手平台的一个 Bug,结局很狗血!赶紧给大家分享一下,顺便也分享下标准的排查 Bug 思路。

事情是这样的,有小伙伴在鱼聪明平台创建了一个 AI 助手,名称为【软件开发人员】。当我搜索 “软件开发” 时,能搜出这个模型:

鱼聪明 AI 助手

结果搜索 “软件开发人员”,也就是助手的全名称时,竟然搜不出结果了?!

鱼聪明 AI 助手

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

按 F12 打开网络控制台,发现搜索关键词传的没毛病:

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

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

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

再次执行搜索,打印出的 SQL 记录如图:

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

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

结果查询结果为 0:

奇怪了,难道数据库中没有这条记录?但是为啥搜索 “软件开发” 的时候,能搜出这个助手呢?

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

气了气了,为啥查不出来啊?!大家也可以猜一猜。

这个时候我其实已经有想法了,难道是数据库中存储的 name 和我们看到的 name 格式(或者字符)不一致?于是我就从数据库中把 name 的值复制出来,如图:

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

于是就有了下面这张神奇的截图,两个 “一模一样” 的 SQL 语句,一个有结果,一个没结果:

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

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

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

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

到底有啥区别呢?问下鱼聪明 AI 吧~

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

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