`

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函数手册.rar_MySQL函数手册_VZI_mysql 函数手册

    MySQL函数手册是一部非常重要的参考资料,尤其对于数据库管理员和开发人员来说,它提供了全面而详细的MySQL数据库函数使用指南。这份手册涵盖了MySQL中各种内置函数的功能、语法以及使用示例,是学习和工作中不可或...

    MySQL常用函数大全

    - **SUM(col)**: 返回指定列`col`中所有值的总和。 - **GROUP_CONCAT(col)**: 将指定列`col`中的所有值连接成一个字符串。 #### 字符串函数 - **ASCII(char)**: 返回字符`char`的ASCII码值。 - **BIT_LENGTH(str)*...

    MySQL常用函数的举例及例子

    ### MySQL常用函数详解 #### 一、数学函数 在MySQL中,数学函数是处理数值数据的基本工具之一。这些函数能够帮助我们执行简单的算术运算、数值转换以及进行数学计算。 - **ABS(x)**:返回`x`的绝对值。例如,`ABS...

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

    本文将探讨在MySQL 8.0.20版本中使用窗口函数`SUM`时出现的一个潜在bug,以及如何理解和解决这个问题。 首先,我们创建一个名为`Score`的成绩表,包含学生的ID(`s_id`)、课程的ID(`c_id`)和学生的分数(`s_...

    db2和mysql数据库函数

    本文将对 DB2 和 MySQL 数据库函数进行分类和介绍,涵盖数学函数、字符串函数、日期函数、聚合函数等多种类型。 一、数学函数 数学函数用于对数字进行计算和分析。DB2 和 MySQL 都提供了一些基本的数学函数,如: ...

    关系型数据库中MySQL常用函数的作用和例子说明

    内容概要:笔者将MySQL常用的函数分为字符串函数、窗口函数、日期和时间函数、聚合函数、数值型函数、逻辑判断函数六类。将每一类别中常用的函数进行汇总,主要向读者介绍各个类别中常用函数的作用,在介绍的同时给...

    mysql函数大全,函数库

    在MySQL中,函数可以分为多种类型,如数学函数、字符串函数、日期和时间函数、控制流程函数、系统信息函数等。下面我们将逐一详细介绍这些类别: 1. **数学函数**: - ABS():返回一个数的绝对值。 - CEIL() 和 ...

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

    在MySQL数据库中,`LIMIT` 与聚合函数如 `SUM()` 混合使用时,可能会引发一些预期之外的问题。本文将深入探讨这个问题,并提供解决方案。 首先,让我们回顾一下问题的背景。假设我们有一个名为 `order` 的订单表,...

    MYSQL数据库校验身份证函数

    ### MySQL数据库校验身份证函数详解 #### 一、引言 在进行用户信息验证时,身份证号的有效性检查是一项常见的需求。特别是在中国,一个合法有效的身份证号码必须符合一定的格式规范和逻辑规则。本文将深入解析...

    MySQL中的SUM函数使用教程

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

    MySQL函数大全中文版

    7. **系统信息函数**:如`USER()`返回当前用户,`VERSION()`提供MySQL服务器的版本信息,`DATABASE()`返回当前数据库名。 8. **加密和哈希函数**:如`MD5()`和`SHA1()`用于生成哈希值,`ENCRYPT()`和`DECRYPT()`...

    MySQL数据库函数,触发器,存储过程

    MySQL提供了丰富的内置函数,包括数值函数(如ABS、SQRT)、字符串函数(如CONCAT、SUBSTRING)、日期和时间函数(如NOW、DATE_ADD)以及一些通用函数(如IFNULL、COUNT)。这些函数可以简化SQL查询,提高代码可读性...

    mysql内部函数

    - Cast函数用于将值从一种数据类型转换为另一种,如 `CAST(A AS INT)` 将A转换为整数。 9. **其他函数**: - 包括位函数(如 `BIT_AND`, `BIT_OR`),加密函数(如 `ENCRYPT`, `AES_ENCRYPT`),信息函数(如 `...

    mysql函数

    例如,在数据分析中,我们可以用SUM()和AVG()函数进行求和与平均值计算;在报表生成时,DATE_FORMAT()和GROUP BY结合可以实现按日期分组的数据展示。 了解并熟练使用MySQL函数对于任何从事数据库管理和开发工作的...

    0.9 MySQL表查询之常见函数

    例如,SUM函数返回数值,AVG函数返回数值,MAX函数返回数值等。 MySQL表查询中的常见函数可以对数据进行各种操作和处理,实现数据的提取、处理和分析。正确地使用函数可以提高查询的效率和可读性。

    mysql 常用函数

    ### MySQL常用函数详解 #### 一、数学函数 在MySQL中,数学函数是数据库操作的基础之一,它们可以处理各种数值运算需求。 - **ABS(X)**:返回`X`的绝对值。 - 示例:`SELECT ABS(-5);` 返回 `5`。 - **BIN(X)*...

    mysql常用函数

    ### MySQL常用函数详解 MySQL作为一款广泛使用的开源关系型数据库管理系统,在数据管理方面提供了丰富的功能。其中,函数是实现各种复杂操作的重要工具之一。本文将详细介绍MySQL中的几类常用函数,包括数学函数、...

    SQL SUM() 函数

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

Global site tag (gtag.js) - Google Analytics