前几天上线,遇到一个郁闷的问题,在测试环境没任何问题的,但是到正式环境却报java.math.BigDecimal cannot be cast to java.lang.String
异常,当时就蒙逼了,难不成正式环境跟测试环境数据库类型还不一样?
经过定位发现罪魁祸首是一句sql里的sum
函数,在测试环境返回的是double
可以直接toString
,但正式环境却变成bigDeciaml,尼玛这么奇葩的问题都被我遇到了,当时心中一万只草泥马奔腾而过。。。
不过,问题终归还是要解决的,只好上网找原因:
The SUM() and AVG() functions return a DECIMAL value for exact-value arguments (integer or DECIMAL), and a DOUBLE value for approximate-value arguments (FLOAT or DOUBLE). (Before MySQL 5.0.3, SUM() and AVG() return DOUBLE for all numeric arguments.)
http://stackoverflow.com/questions/10592481/what-is-the-return-type-of-sum-in-mysql
sum函数在数据库是number类型的,你的代码中可以使用任何装的下数字型都可以接收。如:sum的值小于java中int的最大值,你就可以用int接收;如果大于Int的最大值而小于double的最大值,你就可以用double。一般在程序设计时,如果不确定它的值范围,可以用long型接收。
哈哈,搜第四列,原来一直是我理解错了。sum()
函数返回的就是deciaml类型,测试环境数据都是生成的,复杂的不高,double类型就可以接收了,而正式环境数据超过double的精度范围,悲剧就这样发生了。
原因搞懂了,直接将 toString
改为String.valueOf(xx)
搞定,看来以后还是要养成习惯少用toString
呀,坑太多。
网友评论