记忆犹新的坑"Bit"被我媳妇俘获了
一、问题发生的诡异时间
当晚生产发版,开发,测试环境一切都OK,也没有发现什么异常,就偏偏在周五发版。就报错。
二、问题发生后排查与猜测
当时测试找我我一脸的懵逼和嫌弃。我都没有怀疑自己的代码。她一说我就觉得是环境问题。然后给她一条sql,让她在生产环境执行一下,看是否有数据。结果没有,我暗自开心了一下,心想这不关我事。我就理直气壮的说,没有数据让我推送什么给第三方,我说我的逻辑是,查询到数据后再去推送。没想到,一会又被打脸了,她给我找了两条符合条件的记录给我看。我既生气又郁闷,接着看问题。这次我打开代码去看,结果还是没有找到原因,觉得还是没有问题。我就把同样的sql在测试环境执行,结果有数据,偏偏生产就查不出来。我就把情况给说了一下。我说是不是生产环境做什么了。这个我也没有办法,你的找老大去看,我这边确实是能查到数据的,紧接着我也给我们老大发了消息,说测试环境可以查到数据,生产环境不能,我知道这么晚是不会回我消息的。但也不是推卸责任,处于个各种原有我都应该让老大知晓一下。然后跟我老婆一起看,一起想。在我老婆的指导下,打开了表设计。看了一下字段的数据类型。结果还真给看出了问题。bit类型,我加了单引号,
三、猜测的验证
但我觉得还是没有错,加不加单引号,数据库查询默认会自己加的。也验证了一下,不加和加都是可以查询到数据的。一会我老婆又说,是不是加了索引,加了索引这样加单引号会失效的。于是乎,我就问测试,你是不是加索引了。她说是的,的确加索引了,不加太慢了。这点也我也恍然大悟,没有考虑到这点。接着还是跟我老婆验证这个索引是不是导致查询数据查询不出来的问题,
四、再猜测再验证
测试环境我自己添加了一下索引,继续执行该sql.结果测试环境也查不出来了。问题得到了验证。
五、问题的修复
我跟测试通话说明了原因。生产环境之所以没有推送数据是因为你添加索引导致的,当时没有测到。你现在建任务,我连夜修复。问题找到,解决就是分分钟的事。本地验证无误,提交后。又给我们老大回复了一下消息。说明了问题的产生原因和解决方案,修复完已经凌晨两点半了。不过这次也多亏我老婆,不然自己还真不知道要找到什么时候。吃一点长一智。
六、结论
bit类型的字段如果设置了索引,记得不能加单引号,否则查询失效