Warum gibt CAST (1 AS SIGNED INTEGER) unter MySQL einen BIGINT zurück?

8

Wenn ich das tue, bekomme CAST(1 AS SIGNED INTEGER)ich immer eine BIGINTRücksendung, zum Beispiel:

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

Ich hätte erwartet, dass der Rückgabetyp aus dieser Umwandlung eine LONG(32-Bit-Ganzzahl) ist.

Wenn ich eine Spalte aus einer Tabelle mit einem auswähle, INTsehe ich, dass es sich tatsächlich nur um Folgendes handelt 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>

Wenn ich dieselbe Spalte in eine vorzeichenbehaftete Ganzzahl umwandle, wird erneut eine 64-Bit-Ganzzahl zurückgegeben:

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)

Hier gibt es ein ähnlich gemeldetes Problem:

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

Leider erhält das OP keine klare Antwort.

Ist dies ein Fehler in der CAST()Funktion oder ist dies beabsichtigt?

Kev
quelle
In den Dokumenten für cast () / convert () werden nur 64-Bit-Ganzzahlen erwähnt. Dev.mysql.com/doc/refman/5.7/en/…
Philᵀᴹ
@Phil - das habe ich immer und immer wieder gelesen. Warum steht es SIGNED [INTEGER]im Abschnitt Der Typ für das Ergebnis kann einer der folgenden Werte sein : . Ist a SIGNED INTEGERim Kontext einer CASTnicht tatsächlich 32-Bit-Ganzzahl?
Kev
Ich habe gelesen, dass "MySQL Arithmetik mit vorzeichenbehafteten und vorzeichenlosen 64-Bit-Werten unterstützt. Wenn Sie numerische Operatoren (wie + oder -) verwenden und einer der Operanden eine vorzeichenlose Ganzzahl ist, ist das Ergebnis standardmäßig vorzeichenlos (siehe Abschnitt) 12.6.1, „Arithmetische Operatoren“). Sie können dies überschreiben, indem Sie den Cast-Operator SIGNED oder UNSIGNED verwenden, um einen Wert in eine vorzeichenbehaftete oder vorzeichenlose 64-Bit-Ganzzahl umzuwandeln. " Teil
Philᵀᴹ
@Phil - ja, das habe ich auch gelesen, und das verhält sich tatsächlich wie erwartet, dh es SELECT 1+1führt zu a BIGINT. Aber es erklärt immer noch nicht, warum es CAST()sich im Gegensatz zur Dokumentation verhält (so wie ich es verstehe) und erzeugt einen BIGINTgeraden Wert, wenn es gebeten wird, auf SIGNED INTEGERoder UNSIGNED INTEGERauf einen einzelnen Skalarwert zu übertragen.
Kev
Die beste Lösung, die ich hier gefunden habe: Konvertieren Sie BIGINT UNSIGNED in INT

Antworten:

0

Wie Sie auf https://www.w3schools.com/sql/func_mysql_cast.asp sehen können

SIGNED Konvertiert den Wert in SIGNED (eine vorzeichenbehaftete 64-Bit-Ganzzahl).

UNSIGNED Konvertiert den Wert in UNSIGNED (eine vorzeichenlose 64-Bit-Ganzzahl).

Und aus der offiziellen MySQL-Dokumentation: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html

MySQL unterstützt Arithmetik mit vorzeichenbehafteten und vorzeichenlosen 64-Bit-Werten. Bei numerischen Operatoren (wie + oder -), bei denen einer der Operanden eine Ganzzahl ohne Vorzeichen ist, ist das Ergebnis standardmäßig ohne Vorzeichen (siehe Abschnitt 12.6.1, „Arithmetische Operatoren“). Um dies zu überschreiben, verwenden Sie den Cast-Operator SIGNED oder UNSIGNED, um einen Wert in eine vorzeichenbehaftete oder vorzeichenlose 64-Bit-Ganzzahl umzuwandeln.

Es sieht also so aus, als ob die CAST-Ausgabe tatsächlich eine 64-Bit-Ganzzahl ist, wenn Sie SIGNED- oder UNSIGNED-Datentypen verwenden.

Jesus Uzcanga
quelle
-1

Int als 32-Bit in MySQL speichern.

MySQL unterstützt Arithmetik mit vorzeichenbehafteten und vorzeichenlosen 64-Bit-Werten. Bei numerischen Operatoren (wie + oder -), bei denen einer der Operanden eine Ganzzahl ohne Vorzeichen ist, ist das Ergebnis standardmäßig ohne Vorzeichen. Um dies zu überschreiben, verwenden Sie den Cast-Operator SIGNED oder UNSIGNED, um einen Wert in eine vorzeichenbehaftete oder vorzeichenlose 64-Bit-Ganzzahl umzuwandeln.

Deshalb zeigt es für int long int: 32 bit

und für signiertes int zeigt es long long int ODER BIG int: 64 int

Nishant Uppal
quelle