Perché CAST (1 AS SIGNED INTEGER) restituisce un BIGINT su MySQL?


8

Se lo faccio CAST(1 AS SIGNED INTEGER)finisco sempre per ottenere un BIGINTreso, ad esempio:

$ 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)

Mi sarei aspettato che il tipo restituito da quel cast fosse un LONG(intero a 32 bit).

Se seleziono una colonna da una tabella che ha un INTvedo che è davvero 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>

Se eseguo il cast della stessa colonna su un numero intero con segno, ottengo nuovamente un numero intero a 64 bit restituito:

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)

C'è un problema analogo riportato qui:

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

Ma purtroppo l'OP non ottiene una risposta diretta.

È un bug nella CAST()funzione o è di progettazione?


Guardando i documenti per cast () / convert (), menziona solo numeri interi a 64 bit dev.mysql.com/doc/refman/5.7/en/…
Philᵀᴹ

@Phil - L'ho letto ancora e ancora. Perché lo fa dire SIGNED [INTEGER]nella sezione Il tipo per il risultato può essere uno dei seguenti valori: . È un SIGNED INTEGERnel contesto di una CASTnon di fatto un intero a 32 bit?
Kev

Stavo leggendo "MySQL supporta l'aritmetica con valori a 64 bit sia firmati che non firmati. Se si utilizzano operatori numerici (come + o -) e uno degli operandi è un numero intero senza segno, il risultato non è firmato per impostazione predefinita (vedere la sezione 12.6.1, "Operatori aritmetici"). Puoi sovrascriverlo utilizzando l'operatore di cast SIGNED o UNSIGNED per lanciare un valore su un intero a 64 bit con segno o senza segno, rispettivamente. " parte
Philᵀᴹ

@Phil - sì, l'ho letto anche io, e in effetti si comporta come previsto, cioè fa SELECT 1+1risultati in a BIGINT. Ma non spiega ancora perché CAST()si comporti in contrasto con la documentazione (per come la capisco) e produce BIGINTanche se viene chiesto di eseguire il cast su SIGNED INTEGERo UNSIGNED INTEGERsu un singolo valore scalare.
Kev

La migliore soluzione che ho trovato qui: Converti BIGINT UNSIGNED in INT

Risposte:


0

Come puoi vedere su https://www.w3schools.com/sql/func_mysql_cast.asp

SIGNED Converte il valore in SIGNED (un numero intero a 64 bit con segno)

UNSIGNED Converte il valore in UNSIGNED (un numero intero a 64 bit senza segno)

E dalla documentazione ufficiale di MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html

MySQL supporta l'aritmetica con valori a 64 bit sia firmati che non firmati. Per gli operatori numerici (come + o -) in cui uno degli operandi è un numero intero senza segno, il risultato è senza segno per impostazione predefinita (vedere Sezione 12.6.1, "Operatori aritmetici"). Per sovrascrivere questo, utilizzare l'operatore di cast SIGNED o UNSIGNED per trasmettere un valore a un intero a 64 bit con segno o senza segno, rispettivamente.

Quindi sembra che l'output CAST sarà effettivamente un numero intero a 64 bit quando si utilizzano tipi di dati SIGNED o UNSIGNED.


-1

Int store come 32 bit in MySQL.

MySQL supporta l'aritmetica con valori a 64 bit sia firmati che non firmati. Per gli operatori numerici (come + o -) in cui uno degli operandi è un numero intero senza segno, il risultato è senza segno per impostazione predefinita. Per sovrascrivere questo, utilizzare l'operatore di cast SIGNED o UNSIGNED per trasmettere un valore a un intero a 64 bit con segno o senza segno, rispettivamente.

Ecco perché è per int che mostra long int: 32 bit

e per int firmato sta mostrando long long int OR BIG int: 64 int

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.