Nếu tôi làm, CAST(1 AS SIGNED INTEGER)
tôi luôn luôn nhận được BIGINT
trả lại, ví dụ:
$ 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)
Tôi đã mong đợi kiểu trả về từ cast đó là một LONG
số nguyên (32 bit).
Nếu tôi chọn một cột từ một bảng có INT
tôi thấy rằng đó thực sự chỉ là một 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>
Nếu tôi truyền cùng một cột thành một số nguyên đã ký, tôi lại nhận được một số nguyên 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)
Có một vấn đề tương tự được báo cáo ở đây:
Nhưng thật đáng buồn khi OP không nhận được câu trả lời thẳng thắn.
Đây có phải là một lỗi trong CAST()
chức năng hay đây là do thiết kế?
SIGNED [INTEGER]
trong phần Loại cho kết quả có thể là một trong các giá trị sau : . Là một SIGNED INTEGER
trong bối cảnh CAST
không thực sự là một số nguyên 32 bit?
SELECT 1+1
kết quả trong a BIGINT
. Nhưng nó vẫn không giải thích được tại sao CAST()
lại hành xử trái với tài liệu (theo tôi hiểu) và tạo ra BIGINT
ngay cả khi được yêu cầu truyền tới SIGNED INTEGER
hoặc UNSIGNED INTEGER
trên một giá trị vô hướng.