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 INT
saya 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:
Tapi sayangnya OP tidak mendapatkan jawaban langsung.
Apakah ini bug dalam CAST()
fungsi atau ini karena desain?
SIGNED [INTEGER]
di bagian Jenis untuk hasilnya bisa menjadi salah satu dari nilai berikut: . ApakahSIGNED INTEGER
dalam konteksCAST
tidak sebenarnya integer 32 bit?SELECT 1+1
hasil dalamBIGINT
. Tapi itu masih tidak menjelaskan mengapaCAST()
berperilaku bertentangan dengan dokumentasi (seperti yang saya mengerti) dan menghasilkanBIGINT
bahkan jika diminta untuk dilemparkan keSIGNED INTEGER
atauUNSIGNED INTEGER
pada nilai skalar tunggal.Jawaban:
Seperti yang Anda lihat di https://www.w3schools.com/sql/func_mysql_cast.asp
Dan dari dokumentasi resmi MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html
Jadi sepertinya output CAST akan benar-benar menjadi integer 64 bit ketika Anda menggunakan tipe data SIGNED atau UNSIGNED.
sumber
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
sumber