Si lo hago CAST(1 AS SIGNED INTEGER)
, siempre termino recibiendo un BIGINT
retorno, por ejemplo:
$ mysql -u root -p --column-type-info
Enter password:
--- Copyright and help message snipped for brevity ---
mysql> select cast(1 as signed integer);
Field 1: `cast(1 as signed integer)`
Catalog: `def`
Database: ``
Table: ``
Org_table: ``
Type: LONGLONG <== LONGLONG i.e. 64 bit integer
Collation: binary (63)
Length: 1
Max_length: 1
Decimals: 0
Flags: NOT_NULL BINARY NUM
+---------------------------+
| cast(1 as signed integer) |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
Hubiera esperado que el tipo de retorno de ese elenco fuera un LONG
(entero de 32 bits).
Si selecciono una columna de una tabla que tiene un INT
, veo que de hecho es solo un LONG
:
mysql> describe contact;
+------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+----------------+
| contact_id | int(11) | NO | PRI | NULL | auto_increment |
== remainder of table snipped ==
mysql> select contact_id from contact where contact_id = 20;
Field 1: `contact_id`
Catalog: `def`
Database: `centreon`
Table: `contact`
Org_table: `contact`
Type: LONG <== LONG i.e. 32 bit integer
Collation: binary (63)
Length: 11
Max_length: 2
Decimals: 0
Flags: NOT_NULL PRI_KEY AUTO_INCREMENT NUM PART_KEY
+------------+
| contact_id |
+------------+
| 20 |
+------------+
1 row in set (0.00 sec)
mysql>
Si lanzo la misma columna a un entero con signo, nuevamente obtengo un entero de 64 bits:
mysql> select CAST(contact_id as signed integer) from contact where contact_id = 20;
Field 1: `CAST(contact_id as signed integer)`
Catalog: `def`
Database: ``
Table: ``
Org_table: ``
Type: LONGLONG
Collation: binary (63)
Length: 11
Max_length: 2
Decimals: 0
Flags: NOT_NULL BINARY NUM
+------------------------------------+
| CAST(contact_id as signed integer) |
+------------------------------------+
| 20 |
+------------------------------------+
1 row in set (0.00 sec)
Hay un problema similar reportado aquí:
Pero lamentablemente el OP no obtiene una respuesta directa.
¿Es esto un error en la CAST()
función o es por diseño?
SIGNED [INTEGER]
en la sección El tipo para el resultado puede ser uno de los siguientes valores: . ¿Es unSIGNED INTEGER
en el contexto de unCAST
no de hecho un entero de 32 bits?SELECT 1+1
resultados en aBIGINT
. Pero todavía no explica por qué distanciaCAST()
se comporta contrariamente a la documentación (como yo lo entiendo) y produce unaBIGINT
aunque se solicite su elenco deSIGNED INTEGER
oUNSIGNED INTEGER
en un solo valor escalar.Respuestas:
Como puede ver en https://www.w3schools.com/sql/func_mysql_cast.asp
Y de la documentación oficial de MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html
Parece que la salida CAST en realidad será un entero de 64 bits cuando use tipos de datos FIRMADOS o NO FIRMADOS.
fuente
Int almacenar como 32 bits en MySQL.
MySQL admite aritmética con valores de 64 bits con y sin signo. Para los operadores numéricos (como + o -) donde uno de los operandos es un entero sin signo, el resultado no tiene signo de forma predeterminada. Para anular esto, use el operador de conversión FIRMADO o NO FIRMADO para convertir un valor a un entero de 64 bits con signo o sin signo, respectivamente.
Es por eso que para int está mostrando int largo: 32 bit
y para int firmado se muestra largo largo int O GRANDE int: 64 int
fuente