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:
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: . Apakah SIGNED INTEGERdalam konteks CASTtidak sebenarnya integer 32 bit?
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.