Tại sao CAST (1 NHƯ INTEGER ĐĂNG KÝ) trả lại một BIGINT trên MySQL?


8

Nếu tôi làm, CAST(1 AS SIGNED INTEGER)tôi luôn luôn nhận được BIGINTtrả 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 LONGsố nguyên (32 bit).

Nếu tôi chọn một cột từ một bảng có INTtô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:

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

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ế?


Nhìn vào các tài liệu cho cast () / convert (), nó chỉ đề cập đến số nguyên 64 bit dev.mysql.com/doc/refman/5.7/en/ Kẻ
Philᵀᴹ

@Phil - Tôi đã đọc đi đọc lại. Tại sao nó nói 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 INTEGERtrong bối cảnh CASTkhông thực sự là một số nguyên 32 bit?
Kev

Tôi đã đọc "MySQL hỗ trợ số học với cả hai giá trị 64 bit đã ký và không dấu. Nếu bạn đang sử dụng các toán tử số (như + hoặc -) và một trong các toán hạng là số nguyên không dấu, kết quả sẽ không được ký mặc định (xem Phần 12.6.1, Toán tử Số học Số thập phân). Bạn có thể ghi đè lên điều này bằng cách sử dụng toán tử đúc có chữ ký hoặc chưa ký để tương ứng với một giá trị cho số nguyên 64 bit đã ký hoặc không dấu. " phần
Philᵀᴹ

@Phil - vâng tôi cũng đọc nó, và thực sự nó hoạt động như mong đợi tức là làm SELECT 1+1kế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 BIGINTngay cả khi được yêu cầu truyền tới SIGNED INTEGERhoặc UNSIGNED INTEGERtrên một giá trị vô hướng.
Kev

Giải pháp tốt nhất tôi tìm thấy ở đây: Chuyển đổi BIGINT chưa được ký thành INT

Câu trả lời:


0

Như bạn có thể thấy trên https://www.w3schools.com/sql/func_mysql_cast.asp

Đã ký Chuyển đổi giá trị thành Đã ký (số nguyên 64 bit đã ký)

UNSIGNED Chuyển đổi giá trị thành UNSIGNED (số nguyên 64 bit không dấu)

Và từ tài liệu chính thức của MySQL: https://dev.mysql.com/doc/refman/5.7/en/cast-fifts.html

MySQL hỗ trợ số học với cả giá trị 64 bit đã ký và không dấu. Đối với các toán tử số (chẳng hạn như + hoặc -) trong đó một trong các toán hạng là số nguyên không dấu, kết quả không được ký theo mặc định (xem Phần 12.6.1, Toán tử Số học Toán tử). Để ghi đè lên điều này, hãy sử dụng toán tử truyền có chữ ký hoặc chưa ký để chuyển một giá trị thành số nguyên 64 bit đã ký hoặc không dấu.

Vì vậy, có vẻ như đầu ra CAST thực sự sẽ là một số nguyên 64 bit khi bạn sử dụng các kiểu dữ liệu đã ký hoặc không ký.


-1

Cửa hàng Int là 32 bit trong MySQL.

MySQL hỗ trợ số học với cả giá trị 64 bit đã ký và không dấu. Đối với các toán tử số (chẳng hạn như + hoặc -) trong đó một trong các toán hạng là số nguyên không dấu, kết quả không được ký theo mặc định. Để ghi đè lên điều này, hãy sử dụng toán tử truyền có chữ ký hoặc chưa ký để chuyển một giá trị thành số nguyên 64 bit đã ký hoặc không dấu.

Đó là lý do tại sao đối với int nó hiển thị int dài: 32 bit

và đối với int đã ký, nó hiển thị dài int int BIG BIG: 64 int

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.