聊一聊mysql sum返回类型

2016-09-05  本文已影响3693人  超凡陆战队

前几天上线,遇到一个郁闷的问题,在测试环境没任何问题的,但是到正式环境却报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呀,坑太多。

上一篇下一篇

猜你喜欢

热点阅读