2010-06-28 32 views
143

Tôi đã tự hỏi sự khác biệt giữa BigInt, MediumIntInt là ... dường như rõ ràng là chúng sẽ cho phép số lớn hơn; tuy nhiên, tôi có thể tạo một số Int(20) hoặc BigInt(20) và điều đó có vẻ không nhất thiết về kích thước.Các loại trong MySQL: BigInt (20) so với Int (20)

Một số thông tin chi tiết sẽ tuyệt vời, chỉ là loại tò mò. Tôi đã sử dụng MySQL một lúc và cố gắng áp dụng nhu cầu kinh doanh khi chọn loại, nhưng tôi chưa bao giờ hiểu khía cạnh này.

Trả lời

304

Xem http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

  • INT là một bốn-byte ký số nguyên.

  • BIGINT là số nguyên có 8 byte.

Mỗi người không chấp nhận nhiều hơn và không ít giá trị hơn số lượng byte tương ứng. Điều đó có nghĩa là 2 giá trị trong một số INT và 2 giá trị trong một BIGINT.

20 trong INT(20)BIGINT(20) có nghĩa là hầu như không có gì. Đó là gợi ý cho chiều rộng màn hình. Nó không có gì để làm với lưu trữ, cũng không phải phạm vi của các giá trị mà cột sẽ chấp nhận.

Thực tế, nó chỉ ảnh hưởng đến ZEROFILL tùy chọn:

CREATE TABLE foo (bar INT(20) ZEROFILL); 
INSERT INTO foo (bar) VALUES (1234); 
SELECT bar from foo; 

+----------------------+ 
| bar     | 
+----------------------+ 
| 000000000000000| 
+----------------------+ 

Đó là một nguồn phổ biến của sự nhầm lẫn cho người sử dụng MySQL để xem INT(20) và giả định đó là một giới hạn kích thước, một cái gì đó tương tự như CHAR(20). Đây không phải là trường hợp.

+1

Ồ, bài đăng này đã làm sáng tỏ sự nhầm lẫn của tôi về vấn đề này một cách hoàn hảo. Có vẻ như một sự lựa chọn kỳ quặc bởi các nhà phát triển - như tôi đã đoán nó là chiều rộng + giá trị tối đa, hoặc bit/etc. – Sh4d0wsPlyr

+7

'nó chỉ ảnh hưởng đến tùy chọn ZEROFILL:' bây giờ sự tò mò của tôi kết thúc – Umair

+2

Tôi thực sự mong rằng họ đã thiết kế cú pháp với màn hình hiển thị với trên ZEROFILL thay vì INT. Ví dụ: 'bar INT ZEROFILL (20)'. Nó sẽ rõ ràng hơn rất nhiều. Nhưng quyết định đó đã được thực hiện một thời gian dài trước đây, và thay đổi nó bây giờ sẽ phá vỡ hàng triệu cài đặt cơ sở dữ liệu. –

34

Số trong dấu ngoặc đơn trong khai báo kiểu là chiều rộng màn hình, không liên quan đến phạm vi giá trị có thể được lưu trữ trong một kiểu dữ liệu. Chỉ vì bạn có thể khai báo Int(20) không có nghĩa là bạn có thể lưu trữ các giá trị lên đến 10^20 trong đó:

[...] chiều rộng màn hình tùy chọn này có thể được sử dụng bởi các ứng dụng để hiển thị các giá trị số nguyên có chiều rộng nhỏ hơn chiều rộng được chỉ định cho cột bằng cách đệm chúng với khoảng trắng. ...

Chiều rộng màn hình không hạn chế phạm vi giá trị có thể được lưu trữ trong cột hoặc số chữ số được hiển thị cho các giá trị có chiều rộng vượt quá quy định cho cột. Ví dụ, một cột được chỉ định là SMALLINT (3) có dải SMALLINT thông thường là -32768 đến 32767 và các giá trị ngoài phạm vi cho phép bởi ba ký tự được hiển thị bằng cách sử dụng nhiều hơn ba ký tự.

Đối với một danh sách tối đa và giá trị tối thiểu có thể được lưu trữ trong mỗi kiểu dữ liệu MySQL, xem here.

+1

Bạn có nghĩa là [ở đây] (http://dev.mysql.com/doc/refman/5.0/en/integer-types.html)? – WAF

12

Quote:

Các "bigint (20)" đặc điểm kỹ thuật không phải là một giới hạn chữ số. Nó chỉ có nghĩa là khi dữ liệu được hiển thị, nếu nó sử dụng ít hơn 20 chữ số, nó sẽ được đệm bên trái với số không. 2^64 là giới hạn cứng đối với loại BIGINT, và có 20 chữ số, do đó BIGINT (20) chỉ có nghĩa là mọi thứ nhỏ hơn 10^20 sẽ được đệm bên trái với khoảng trống trên màn hình.

+2

2^64 (chưa ký) thực sự có 21 chữ số. BIGINT (20) rất nguy hiểm. Những người sử dụng nó dường như biện minh cho việc sử dụng của họ trên ý tưởng rằng 2^64 phù hợp với 20 chữ số thập phân. Nếu đó là trường hợp, tại sao chỉ định một giới hạn chiều rộng ở tất cả? Khi nó quay ra, điều đó cũng không chính xác. 21 chữ số là cần thiết để hiển thị đúng 2^64. –

1

tôi muốn thêm một điểm nữa là, nếu bạn đang lưu trữ một số thực sự lớn như 902054990011312 sau đó người ta có thể dễ dàng nhận thấy sự khác biệt của INT(20)BIGINT(20). Đó là khuyến khích để lưu trữ trong BIGINT.

0

Theo như tôi biết, chỉ có một khác biệt nhỏ là khi bạn đang cố chèn giá trị nằm ngoài phạm vi.

Trong ví dụ tôi sẽ sử dụng 401421228216, đó là 101110101110110100100011101100010111000 (chiều dài ký tự)

  • Nếu bạn có INT(20) cho hệ thống này có nghĩa là phân bổ trong bộ nhớ tối thiểu 20 bit. Nhưng nếu bạn sẽ chèn giá trị lớn hơn 2^20, nó sẽ được lưu trữ thành công, chỉ khi nó là ít hơn INT(32) -> 2147483647 (hoặc 2 * INT(32) -> 4294967295 cho UNSIGNED)

Ví dụ:

mysql> describe `test`; 
+-------+------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+-------+------------------+------+-----+---------+-------+ 
| id | int(20) unsigned | YES |  | NULL |  | 
+-------+------------------+------+-----+---------+-------+ 
1 row in set (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
ERROR 1264 (22003): Out of range value for column 'id' at row 1 

mysql> SET sql_mode = ''; 
Query OK, 0 rows affected, 1 warning (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
Query OK, 1 row affected, 1 warning (0,06 sec) 

mysql> SELECT * FROM `test`; 
+------------+ 
| id   | 
+------------+ 
| 4294967295 | 
+------------+ 
1 row in set (0,00 sec) 
  • Nếu bạn có BIGINT(20) cho hệ thống này có nghĩa là phân bổ trong bộ nhớ tối thiểu 20 bit. Nhưng nếu bạn sẽ chèn giá trị lớn hơn 2^20, nó sẽ được lưu trữ thành công, nếu nó ít hơn BIGINT(64) -> 9223372036854775807 (hoặc 2 * BIGINT(64) -> 18446744073709551615 cho UNSIGNED)

Ví dụ:

mysql> describe `test`; 
+-------+---------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+-------+---------------------+------+-----+---------+-------+ 
| id | bigint(20) unsigned | YES |  | NULL |  | 
+-------+---------------------+------+-----+---------+-------+ 
1 row in set (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
Query OK, 1 row affected (0,04 sec) 

mysql> SELECT * FROM `test`; 
+--------------+ 
| id   | 
+--------------+ 
| 401421228216 | 
+--------------+ 
1 row in set (0,00 sec) 
Các vấn đề liên quan