¿Por qué CAST (1 AS SIGNED INTEGER) devuelve un BIGINT en MySQL?

8

Si lo hago CAST(1 AS SIGNED INTEGER), siempre termino recibiendo un BIGINTretorno, 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í:

http://bugs.mysql.com/bug.php?id=64084

Pero lamentablemente el OP no obtiene una respuesta directa.

¿Es esto un error en la CAST()función o es por diseño?

Kev
fuente
En cuanto a la documentación para fundición () / convert (), sólo se menciona enteros de 64 bits dev.mysql.com/doc/refman/5.7/en/...~~V~~plural~~3rd
Philᵀᴹ
@ Phil: lo leí una y otra vez. ¿Por qué dice SIGNED [INTEGER]en la sección El tipo para el resultado puede ser uno de los siguientes valores: . ¿Es un SIGNED INTEGERen el contexto de un CASTno de hecho un entero de 32 bits?
Kev
Estaba leyendo "MySQL admite aritmética con valores de 64 bits con signo y sin signo. Si está utilizando operadores numéricos (como + o -) y uno de los operandos es un entero sin signo, el resultado no tiene signo de forma predeterminada (consulte la Sección 12.6.1, "Operadores aritméticos"). Puede anular esto utilizando el operador de conversión FIRMADO o SIN FIRMAR para emitir un valor a un entero de 64 bits con signo o sin signo, respectivamente ". parte
Philᵀᴹ
@ Phil - sí, también lo leí, y de hecho eso se comporta como se esperaba, es decir, haciendo SELECT 1+1resultados en a BIGINT. Pero todavía no explica por qué distancia CAST()se comporta contrariamente a la documentación (como yo lo entiendo) y produce una BIGINTaunque se solicite su elenco de SIGNED INTEGERo UNSIGNED INTEGERen un solo valor escalar.
Kev
La mejor solución que encontré aquí: Convertir BIGINT UNSIGNED a INT

Respuestas:

0

Como puede ver en https://www.w3schools.com/sql/func_mysql_cast.asp

SIGNED Convierte el valor en SIGNED (un entero de 64 bits con signo)

UNSIGNED Convierte el valor en UNSIGNED (un entero de 64 bits sin signo)

Y de la documentación oficial de MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html

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 (consulte la Sección 12.6.1, "Operadores aritméticos"). Para anular esto, utilice el operador de conversión FIRMADO o NO FIRMADO para convertir un valor en un entero de 64 bits con signo o sin signo, respectivamente.

Parece que la salida CAST en realidad será un entero de 64 bits cuando use tipos de datos FIRMADOS o NO FIRMADOS.

Jesus Uzcanga
fuente
-1

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

Nishant Uppal
fuente