美文网首页
聊一聊mysql sum返回类型

聊一聊mysql sum返回类型

作者: 超凡陆战队 | 来源:发表于2016-09-05 15:28 被阅读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呀,坑太多。

    相关文章

      网友评论

          本文标题:聊一聊mysql sum返回类型

          本文链接:https://www.haomeiwen.com/subject/gtprettx.html