现象
开发小哥写了一个这样的SQLselect * from XXX where no = 1234567890
,在开发测试环境测试都OK,然后就信心满满的上生产了,第二天就蛋疼了,这个SQL在生产执行报错,这是怎么一回事呢?开发的自测加上测试的把关难道是摆设?原因肯定是要来分析这个SQL了。
原因
no字段虽然是varchar2类型的,但是如果存储的数据全是数值类型,oracle在查询时会做一个隐式转换,也就是这个SQL不加单引号也能正常查询的原因。
如果no字段中存储的不全是数值类型,那么这个隐式转换就失败了,因为生产上存在非数值类型的数据,导致查询异常。
解决方式
数据库字段的类型能定义成varchar2的尽量定义成字符串类型,查询的时候一定得加上单引号,加上单引号加上单引号加上单引号加上单引号,正确的SQL为select * from XXX where no = '1234567890'
。谨记谨记谨记!