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.
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
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
Revisa esta pregunta.
– Vatev
17 de marzo de 2016 a las 9:56