`

MySQL的sum函数返回的类型

阅读更多
今天项目切换数据库时,出错

访问数据库的代码大概是这样:
String sql =  "select sum(number) as sumNumberOfOneDay from tableName";
List<Map> rows = getJdbcTemplate().queryForList(sql);
for (Map row : rows) {
	SomeBean item = new SomeBean();
	item.setSumNumberOfOneDay(objectToInt(row.get("sumNumberOfOneDay")));

}
	
private int objectToInt(Object obj) {
	return Integer.parseInt("" + obj);
}


表字段“number”的类型是int(10) unsigned
       
连接数据库DataBaseA,测试运行正常;切换到另一数据库DataBaseB(数据库表,表名,表结构一样)时,发现报错:
java.lang.NumberFormatException: For input string: "10.0"

把sql语句拷贝到MySQL命令行窗口里面直接执行,sum(number)返回的值是10;
但在Spring的getJdbcTemplate().queryForList(sql)返回,则变成了10.0,
打印row.get("sumNumberOfOneDay").getClass()的结果是:class java.lang.Double

切回DataBaseA,打印结果是java.math.BigDecimal

两个数据库的查询结果在MySQL命令行窗口返回整数,但在Java程序中返回浮点数

那不用Spring,直接操作JDBC:
	Connection conn = getJdbcTemplate().getDataSource().getConnection();
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(sql);
            ResultSetMetaData rsmd = rs.getMetaData();
            for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                String name = rsmd.getColumnName(i);
                String type = rsmd.getColumnTypeName(i);
                System.out.println(name + ", " + type);
            }

DataBaseA打印的结果:
sumNumberOfOneDay, DECIMAL

DataBaseB打印的结果:
sumNumberOfOneDay, DOUBLE

基本可判断是MySQL的问题

网上搜索一下,果然:
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

原来MySQL 5.0.3之前的版本,sum函数返回的是DOUBLE类型

回头检查一下MySQL的版本:

DataBaseA:
5.1.44 Source distribution

DataBaseB:
4.1.7-standard-log

果然是这样

解决办法:
1.笨方法,就是重写objectToInt方法:
	if (obj instanceof Double) {
            return ((Double)obj).intValue();
        }
        if (obj instanceof BigDecimal) {
            return ((BigDecimal)obj).intValue();
        }
        return Integer.parseInt(obj.toString());
			

2.利用Spring的BeanPropertyRowMapper:
List<SomeBean> list = getJdbcTemplate().query(sql, new BeanPropertyRowMapper(SomeBean.class));

应该尽量采用方法2,避免自己处理

查看一下Spring的getJdbcTemplate().query(sql, new BeanPropertyRowMapper(SomeBean.class))方法,
发现它的大体思路是这样:
1.通过SomeBean.class得到所有property
2.根据property的类型,调用ResultSet.getXXX()得到对应的值
在ResultSet.getXXX()方法里面,就实现了类型转换
例如com.mysql.jdbc.Result的getInt方法(关键部分的代码):
val = getString(columnIndex);
		if ((val != null) && (val.length() != 0)) {
            if ((val.indexOf("e") == -1) && (val.indexOf("E") == -1)
                    && (val.indexOf(".") == -1)) {
                return Integer.parseInt(val);
            } else {
                // Convert floating point
                return (int) (Double.parseDouble(val));
            }
        } else {
            return 0;
        }



    
2
0
分享到:
评论

相关推荐

    MySQL对window函数执行sum函数可能出现的一个Bug

    问题点:在sum对window函数执行时,如果有重复数据,会直接把相同的数据相加,并不是逐步相加。 问题描述 数据:在一个成绩表中,有三个个字段:学生s_id,课程c_id,成绩s_score。 查询条件查询每个课程的学生成绩...

    MySQL中的SUM函数使用教程

    MySQL的SUM函数是用来找出记录中各种的字段的总和。 要了解SUM函数考虑EMPLOYEE_TBL表具有以下记录: mysql&gt; SELECT * FROM employee_tbl; +------+------+------------+--------------------+ | id | name | work_...

    mysql踩坑之limit与sum函数混合使用问题详解

    主要给大家介绍了关于mysql踩坑之limit与sum函数混合使用问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    mysql查询多少秒内的数据,分类统计用户,sum()函数的一个特殊用法 一条比较经典的语句

    mysql查询多少秒内的数据,分类统计用户,sum()函数的一个特殊用法 一条比较经典的语句mysql查询多少秒内的数据,分类统计用户,sum()函数的一个特殊用法 一条比较经典的语句mysql查询多少秒内的数据,分类统计用户,...

    SQL SUM() 函数

    SUM() 函数返回数值列的总数。 SQL SUM() 语法 SELECT SUM(column_name) FROM table_name; 演示数据库 在本教程中,我们将使用 RUNOOB 样本数据库。 下面是选自 “access_log” 表的数据: mysql&gt; SELECT * FROM ...

    MySQL常见函数使用(二).pdf

    聚合函数:如SUM(), AVG(), MAX(), MIN(), GROUP_CONCAT()等。 加密和解密函数:如MD5(), AES_ENCRYPT(), AES_DECRYPT()等。 其他实用函数:如INET_ATON(), INET_NTOA()等。 函数的组合使用:展示如何将多个函数组合...

    mysql数据库函数大全

    MYSQL数据库的函数使用大全。 例如常用的ASCII、SUM、MAX、CONV等

    MYSQL中有关SUM字段按条件统计使用IF函数(case)问题

    今天群里有人问了个问题是这样的: 然后有群友是这样回答的 代码如下: select name,sum(case when stype=4 then money*(-1) else money end ) as M from table group by name 我想了想,应该可以用IF函数 于是改了下...

    MySQL 常用函数总结

    前言: MySQL数据库中提供了很丰富的函数,比如我们常用的聚合函数,日期及字符串处理函数等。... SUM(col) 求和,返回指定列的总和 AVG(col) 求平均值,返回指定列数据的平均值 2.数值型函数 数

    mysql常用函数实例总结【聚集函数、字符串、数值、时间日期处理等】

    本文实例讲述了mysql常用函数。分享给大家供大家参考,具体如下: 本文内容: mysql函数的介绍 聚集函数 avg count max min sum 用于处理字符串的函数 合并字符串函数:concat(str1,str2,str3…) 比较字符...

    mysql2005常用函数

    mysql2005常用函数  转换函数: convert(数据类型,值,格式)  统计函数 1. AVG --求平均值 2. COUNT --统计数目 3. MAX --求最大值 4. MIN --求最小值 5. SUM --求和  ....................................

    MySQL DQL - 聚合函数.md

    示例代码演示了使用`SUM`、`AVG`、`MAX`和`MIN`等聚合函数的方法。您可以根据需要选择适当的聚合函数,并指定要进行聚合操作的列名。此外,还可以组合多个聚合函数在一条查询语句中同时计算多种统计结果。 通过阅读...

    MYSQL,SQLSERVER,ORACLE常用的函数

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL&gt; select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- --------- --------- --------- ...

    MySQL数据库:聚合函数.pptx

    其中,expression是常量、列、函数或表达式,其数据类型可以是数字、字符和时间日期类型。 ; 【例】 求sell表中订购了图书编号为TP7/301-135的订单的最高订购册数和最低订购册数。 SELECT MAX(订购册数), MIN(订购册...

    MySQL常用聚合函数详解

    返回指定列的平均值 二、COUNT COUNT(col) 返回指定列中非NULL值的个数 三、MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回指定列的最大值 四、SUM SUM(col) 返回指定列的所有值之和 五、GROUP_CONCAT GROUP_...

    mysql varchar类型求和实例操作

    3、在数据量少的时候可以使用sum()函数直接求和,因为MySQL中它可以自动识别是字符串类型还是数字类型。 4、以上适用于整数,或者是数据量小,要是数据量太大,并且精度较高不适用,那么就可以考虑使用MySQL 的CAST...

Global site tag (gtag.js) - Google Analytics