为什么 SUM('column') 返回一个字符串而不是一个整数


Why SUM(`column`) returns a string instead of an integer?

我正在使用Laravel,并且有一个查询,该查询使用列DB::raw() SUM()进行选择:

DB::raw("SUM(points) as game_points")

我已经安装了mysqldn,AFAIK Laravel使用PDO

game_points是一个字符串,无论列是什么类型。(这是一个整数列

另外,如果我这样做:

DB::raw("COUNT(id) as foo_bar")

foo_bar以整数形式返回。

这既不是Laravel也不是PDO的问题。

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

  • 它可以溢出 PHP 的 int 类型,大于 PHP_INT_MAX。
  • 此外,如果返回的值是十进制数,则由于浮点数固有的不精确性,它可能会失去精度(例如 DECIMAL(10,2) 可以准确存储 0.1,而 PHP 的本机浮点类型可以存储的最接近的东西是 0.10000000000000000055511151231257827021181583404541015625 )

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

您可以

尝试使用CONVERT(INT, game_points)将该字符串转换为整数

根据 bugs.mysql.com,sum()返回一个NEWDECIMAL数据类型,相当于php中的string,而count()返回一个integer数据类型。