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

2022-08-30 22:04:47

我正在使用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以整数形式返回。


答案 1

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

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

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

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


答案 2

您可以尝试将该字符串转换为整数,方法是使用CONVERT(INT, game_points)

根据 bugs.mysql.com,返回一个数据类型,这相当于php,同时返回一个数据类型。sum()NEWDECIMALstringcount()integer


推荐