为什么SUM(`column`)返回的是字符串而不是整数?

29
我正在使用Laravel,并且有一个查询,使用DB::raw()SUM()选择一个列的总和: DB::raw("SUM(points) as game_points") 我已经安装了mysqldn,据我所知,Laravel使用的是PDO
但是,无论列的类型是什么,game_points都是一个字符串。(它是一个整数列)
另外,如果我这样做: DB::raw("COUNT(id) as foo_bar") foo_bar会作为一个整数返回。

请查看这个问题 - Vatev
2个回答

45

这不是Laravel或PDO的问题。

根据MySQL手册,对于精确值参数(整数或DECIMAL),SUM()返回一个DECIMAL值。而在PHP中表示DECIMAL类型的唯一方法是字符串,有两个原因:

  • 它可能会溢出PHP的int类型,大于PHP_INT_MAX。
  • 另外,在返回值为小数时,由于浮点数固有的不精确性质,可能会失去精度(例如,DECIMAL(10,2)可以准确地存储0.1,而php本机浮点类型可以存储的最接近的数字是0.1000000000000000055511151231257827021181583404541015625)

由于这些预防措施,值以字符串形式返回,您应该根据期望值手动转换它-使用标准的PHP类型转换或使用一些专用的数学函数,如bcmath。


5
有趣,这就是为什么 CAST(SUM(column) AS INTEGER) 仍然有效并返回一个整数的原因。 - Marcel Hernandez
1
从至少mysql 8.0开始,AS INTEGER会抛出错误。因此,您需要编写AS UNSIGNED。更多信息请参见:https://dev59.com/RWct5IYBdhLWcg3wZMjn - Tadas V.

0
你可以尝试使用CONVERT(INT, game_points)将该字符串转换为整数。
根据bugs.mysql.comsum()返回一个NEWDECIMAL数据类型,相当于php中的string,而count()返回一个integer数据类型。

2
我知道如何将它们转换为整数。我想知道为什么会发生这种情况 :) - Ivanka Todorova
这是因为您的数据库不是整数或浮点数,而是VHARCHA或其他类型。 - Emmanuel Iyen-Mediatrees

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接