【问题标题】:Datatype of SUM result in MySQLMySQL 中 SUM 结果的数据类型
【发布时间】:2008-11-27 09:14:37
【问题描述】:

在使用 SUM 时,我在将 MySQL 查询的结果转换为 Java 类时遇到了一点问题。

在 MySQL 中执行简单 SUM 时

SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate';

price 是一个整数,看起来SUM 有时会返回一个字符串,有时会返回一个整数,具体取决于 JDBC 驱动程序的版本。

显然,服务器确实告诉 JDBC 驱动程序 SUM 的结果是一个字符串,而 JDBC 驱动程序有时会“方便地”将其转换为整数。 (见Marc Matthews' explanation)。

Java 代码使用一些BeanInfoIntrospection 来自动用查询结果填充(列表)bean。但是,如果部署应用程序的服务器之间的数据类型不同,这显然是行不通的。

我不在乎我得到的是字符串还是整数,但我希望始终拥有相同的数据类型,或者至少提前知道我将获得哪种数据类型。

有没有办法知道 MySQL SUM 从 Java 代码中返回哪种数据类型?或者有谁知道更好的方法来解决这个问题?

【问题讨论】:

    标签: java mysql sum return-type


    【解决方案1】:

    这只是一个猜测,但可能强制转换为整数会迫使 MySQL 总是告诉它是一个整数。

    SELECT CAST(SUM(price) AS SIGNED) FROM cakes WHERE ingredient = 'marshmallows';
    

    【讨论】:

    • 棉花糖是怎么回事?
    • 我喜欢棉花糖蛋糕
    • 如此专注于摆弄驱动程序我完全忽略了流血明显的 mysql 解决方法:) 非常感谢
    • 好的,这个answer&cmets刚刚开始在网上闲逛。在一个随机有趣的图片网站上注意到它。
    • @Dykam:那么,那个网站可能不太好笑。
    【解决方案2】:

    我以前从未使用过 MySQL,所以我不能说为什么,但如果你说:

    ResultSet rs = statement.executeQuery("SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate'");
    int sum = 0;
    if(rs.next())
    size = Integer.parseInt(rs.getString(1));
    

    那么无论返回的数据类型如何,您都不应该有问题,如文档所述:

    String getString(int columnIndex) 抛出 SQLException


    在Java编程语言中作为字符串检索此ResultSet对象的当前行中指定列的值

    【讨论】:

    • 使用 java 11 和 mysql 连接器 j 8 ResultSet#getString 求和`BIGINTt 返回一个带小数点的字符串,即“0。因此不能用parseInt 解析
    【解决方案3】:

    我发现 COALESCE(SUM(price),0) 在没有结果的情况下始终确保该字段返回 0 很有用。

    见:http://lists.mysql.com/mysql/177427

    【讨论】:

      猜你喜欢
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2015-06-03
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多