¿Por qué SUM(`column`) devuelve una cadena en lugar de un número entero?

2 minutos de lectura

Avatar de usuario de Ivanka Todorova
ivanka todorova

Estoy usando Laravel y tengo una consulta que selecciona usando DB::raw() SUM() de una columna:

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

he instalado mysqldn y AFAIK Laravel utiliza PDO.

Pero game_points es una cadena, sin importar qué tipo de columna sea. (es una columna entera)

También si hago:

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

foo_bar se devuelve como un entero.

  • Revisa esta pregunta.

    – Vatev

    17 de marzo de 2016 a las 9:56

Tu avatar de usuario de Common Sense
Tu sentido común

No es un problema de Laravel o PDO.

De acuerdo a mysql manual, SUM() devuelve un DECIMAL valor para argumentos de valor exacto (integer o DECIMAL). Y la única manera de representar DECIMAL escribir en PHP es cadenapor dos razones:

  • puede desbordar el tipo int de PHP, siendo mayor que PHP_INT_MAX.
  • además, en caso de que el valor devuelto sea un número decimal, puede perder precisión debido a naturaleza inherentemente imprecisa de números de punto flotante (por ejemplo, DECIMAL (10,2) puede almacenar con precisión 0.1, mientras que lo más parecido que puede almacenar el tipo flotante nativo de php es 0.1000000000000000055511151231257827021181583404541015625)

Debido a estas precauciones, el valor se devuelve como una cadena, y se supone que debe convertirlo manualmente de acuerdo con el valor esperado, ya sea utilizando el tipo de conversión estándar de PHP o utilizando algunas funciones matemáticas dedicadas, como bcmath.

  • Interesante, por eso CAST(SUM(column) AS INTEGER) todavía funciona y devuelve un número entero.

    – Marcel Hernández

    27 de enero de 2020 a las 23:20

  • a partir de al menos mysql 8.0 AS INTEGER arroja un error. así que necesitas escribir COMO SIN FIRMAR. para más

    –Tadas V.

    15 de noviembre de 2022 a las 10:35


Avatar de usuario de SEsterbauer
SEsterbauer

Podría intentar convertir esa cadena en un número entero usando CONVERT(INT, game_points)

De acuerdo a errores.mysql.com, sum() devuelve un NEWDECIMAL tipo de datos, que es equivalente a string en php, mientras count() devuelve un integer tipo de datos.

  • Sé qué hacer para convertirlos/convertirlos en enteros. Pregunto por qué sucede esto. 🙂

    – Ivanka Todorova

    17/03/2016 a las 10:00

¿Ha sido útil esta solución?