今天在项目中,遇到一个非常奇怪的问题,如图:
两张表关联查询,用了on条件,为什么会查出来多余的数据呢,且id和business_key 查出来的值不一样。找了很久原因,才发现,businesskey类型建成了varchar类型,就一个是数字类型,一个是字符串类型,导致了关联出来不一样的数据,把businesskey的类型改为数字类型,sql正常了。
问题是解决了,但是我这里又有一个疑问,就这张表的数据一直没有出现个问题,为什么就这几条数据会出现这个问题呢?我们知道,mysql数据库中字符串和数字比较,字符串会自动转化数字,如果没有数字则转化为0。 照这样的话,上面的数据也不应该出现上面的结果,毕竟 598342837821595650 与 598342837821595648 是两个不同的数字。所以我又做了下面的测试:
如上图, 字符串和数字比较出现了不同的结果 ,在这里的话,我想在mysql中,应该是当数字位数大于一定位数时,出现了精度丢失的情况,导致出现了上面的结果,所以接着做了下面的测试:
可以发现,他们的结果一模一样,被转成了科学计数法,所以,最后得到一个结论,mysql字符类型数字和数字比较时,当大于一定数值时,会被转成科学计数法,存在精度丢失的问题。在工作中,一定要尽量避免数字与字符类型数字的比较,不然会出现一些不可预知的错误!!!