Mengapa CAST (1 AS SIGNED INTEGER) mengembalikan BIGINT di MySQL?

8

Jika saya melakukannya, CAST(1 AS SIGNED INTEGER)saya selalu mendapatkan pengembalian BIGINT, misalnya:

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

Saya akan mengharapkan tipe kembali dari pemain itu menjadi LONG(32 bit integer).

Jika saya memilih kolom dari tabel yang memiliki INTsaya melihat bahwa itu memang hanya 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>

Jika saya melemparkan kolom yang sama ke integer yang ditandatangani, saya kembali mendapatkan integer 64 bit:

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)

Ada masalah yang dilaporkan serupa di sini:

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

Tapi sayangnya OP tidak mendapatkan jawaban langsung.

Apakah ini bug dalam CAST()fungsi atau ini karena desain?

Kev
sumber
Melihat dokumen untuk pemeran () / convert (), ia hanya menyebutkan bilangan bulat 64-bit dev.mysql.com/doc/refman/5.7/en/…
Philᵀᴹ
@ Phil - Saya memang membacanya berulang-ulang. Mengapa itu mengatakan SIGNED [INTEGER]di bagian Jenis untuk hasilnya bisa menjadi salah satu dari nilai berikut: . Apakah SIGNED INTEGERdalam konteks CASTtidak sebenarnya integer 32 bit?
Kev
Saya membaca "MySQL mendukung aritmatika dengan nilai 64-bit yang ditandatangani dan tidak ditandatangani. Jika Anda menggunakan operator numerik (seperti + atau -) dan salah satu operan adalah bilangan bulat yang tidak ditandai, hasilnya tidak ditandai secara default (lihat Bagian 12.6.1, "Operator Aritmatika"). Anda dapat mengesampingkan ini dengan menggunakan operator gips SIGNED atau UNSIGNED untuk memberikan nilai masing-masing ke integer 64-bit yang ditandatangani atau tidak ditandatangani. " bagian
Philᵀᴹ
@ Phil - ya saya membacanya juga, dan memang itu berperilaku seperti yang diharapkan yaitu melakukan SELECT 1+1hasil dalam BIGINT. Tapi itu masih tidak menjelaskan mengapa CAST()berperilaku bertentangan dengan dokumentasi (seperti yang saya mengerti) dan menghasilkan BIGINTbahkan jika diminta untuk dilemparkan ke SIGNED INTEGERatau UNSIGNED INTEGERpada nilai skalar tunggal.
Kev
Solusi terbaik yang saya temukan di sini: Konversi BIGINT UNSIGNED ke INT

Jawaban:

0

Seperti yang Anda lihat di https://www.w3schools.com/sql/func_mysql_cast.asp

DITANDATANGANI Mengkonversi nilai menjadi DITANDATANGANI (integer 64-bit yang ditandatangani)

UNSIGNED Mengkonversi nilai menjadi UNSIGNED (integer 64-bit yang tidak ditandatangani)

Dan dari dokumentasi resmi MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html

MySQL mendukung aritmatika dengan nilai 64-bit yang ditandatangani dan tidak ditandatangani. Untuk operator numerik (seperti + atau -) di mana salah satu operan adalah bilangan bulat yang tidak ditandatangani, hasilnya tidak ditandatangani secara default (lihat Bagian 12.6.1, “Operator Aritmatika”). Untuk mengesampingkan hal ini, gunakan operator transmisi SIGNED atau UNSIGNED untuk memberikan nilai masing-masing ke integer 64-bit yang ditandatangani atau tidak.

Jadi sepertinya output CAST akan benar-benar menjadi integer 64 bit ketika Anda menggunakan tipe data SIGNED atau UNSIGNED.

Jesus Uzcanga
sumber
-1

Int store sebagai 32 bit di MySQL.

MySQL mendukung aritmatika dengan nilai 64-bit yang ditandatangani dan tidak ditandatangani. Untuk operator numerik (seperti + atau -) di mana salah satu operan adalah bilangan bulat yang tidak ditandatangani, hasilnya tidak ditandatangani secara default. Untuk mengesampingkan hal ini, gunakan operator transmisi SIGNED atau UNSIGNED untuk memberikan nilai masing-masing ke integer 64-bit yang ditandatangani atau tidak.

Itu sebabnya untuk int itu menunjukkan panjang int: 32 bit

dan untuk int yang ditandatangani ini menunjukkan int panjang atau OR int: 64 int

Uppal Nishant
sumber