今天接触到一个很有意思的问题。当我在执行一条INSERT的sql语句时,他总是报字符串转数字类型失败。

问题

首先,该表中的所有数字类型的字段都是非必填,其次,每个数字类型的字段都有默认值。最令我感到疑惑的是,当我测试不加入那些必填字段做INSERT时,数据库仍然报这个错误,这就让我有点摸不着头脑了,因为我的经验是当你新增数据而没有添加必填字段一起时(这些字段没有默认值),数据库肯定是会报这个错误,而且当SQL中存在其他错误时,也是优先报出这种错误。所以今天这个错误让我感到很疑惑。

虽然很疑惑这个报错的情况不符合自己以往的经验,但还是打算循着这个错误描述去对每个字段作检查。

调试

首先,将INSERT语句中的非数字类型的字段及其值删除,执行后,发现还是会报一样的错误,而且提供的所有的值都是数字。接着,查看表中有哪些数字类型的字段,然后再查看INSERT语句中缺少了哪个,终于发现一个数字类型的字段不存在于INSERT中,于是添加这个字段做测试,果不其然,语句成功执行。到这里,基本上能猜测到导致该问题的原因了,也即,当我没有添加该字段做新增时,语句失败,添加后,语句成功,那么很明显,是该字段的默认值有问题(因为数字类型的字段在不做处理的情况下,是不可以保存空值的)。经过检查,该字段的默认值是一个空字符串''。解决方法很简单,修改其默认值为0即可。

总结

此次遇到的这个问题,并不复杂,使得自己愿意写一篇文章的原因主要是自己的经验欺骗了自己。特别是在不添加必填字段执行语句时,报的错误居然不是符合自己经验的情况,这让自己走进了误区。后面,自己将会去深入的研究一下,SQL报错时,是基于什么优先级来处理的。
本篇文章由一文多发平台ArtiPub自动发布


hilsion
8 声望0 粉丝

nice code