我想知道BigInt
,MediumInt
和Int
之间的区别是什么......显然他们会允许更大的数字;但是,我可以制作一个Int(20)
或BigInt(20)
,这看起来似乎不一定是大小。
有些洞察力会很棒,只是有点好奇。我一直在使用 MySQL 并尝试在选择类型时应用业务需求,但我从未理解这方面。
答案 0 :(得分:399)
请参阅http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html
INT
是一个四字节有符号整数。
BIGINT
是一个8字节有符号整数。
它们各自接受的值不会超过它们各自的字节数。这意味着INT
中的{sup> 32 值和BIGINT
中的2 64 值。
INT(20)
中的20和BIGINT(20)
几乎没有任何意义。这是显示宽度的提示。它与存储无关,也与列可接受的值范围无关。
实际上,它仅影响ZEROFILL
选项:
CREATE TABLE foo ( bar INT(20) ZEROFILL );
INSERT INTO foo (bar) VALUES (1234);
SELECT bar from foo;
+----------------------+
| bar |
+----------------------+
| 00000000000000001234 |
+----------------------+
这是MySQL用户看到INT(20)
的一个常见混淆,并假设它是一个大小限制,类似于CHAR(20)
。事实并非如此。
答案 1 :(得分:38)
类型声明中括号中的数字是显示宽度,它与可以存储在数据类型中的值范围无关。仅仅因为您可以声明Int(20)
并不意味着您可以存储最多10 ^ 20的值:
[...]应用程序可以使用此可选显示宽度,通过用空格左边填充来显示宽度小于为列指定的宽度的整数值。 ...
显示宽度不会限制可以存储在列中的值的范围,也不会限制宽度超过为列指定的值的值显示的位数。例如,指定为SMALLINT(3)的列的通常SMALLINT范围为-32768到32767,超出三个字符允许的范围之外的值将使用三个以上的字符显示。
有关可以存储在每种MySQL数据类型中的最大值和最小值的列表,请参阅 here 。
答案 2 :(得分:12)
“BIGINT(20)”规范不是数字限制。它只是意味着当显示数据时,如果它使用少于20个数字,它将用零填充左边。 2 ^ 64是BIGINT类型的硬限制,并且本身有20个数字,因此BIGINT(20)只意味着小于10 ^ 20的所有内容都将在显示屏上留下空格。
答案 3 :(得分:2)
据我所知,当你试图插入超出范围的值时,只有一个小的区别。
在示例中,我将
"jest": { "moduleDirectories": [ "node_modules", "yourdirectoryhere" ], ... }
使用401421228216
(长度 39 字符)
101110101110110100100011101100010111000
,则表示在内存中分配最少20位。但是,如果您输入的值大于INT(20)
,则只有在2^20
(或INT(32) -> 2147483647
2 * INT(32) -> 4294967295
之后,它才会成功存储})示例:强>
UNSIGNED
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)
,则表示在内存中分配最少20位。但是,如果您输入的值大于BIGINT(20)
,则会成功存储,如果它小于2^20
(或BIGINT(64) -> 9223372036854775807
2 * BIGINT(64) -> 18446744073709551615
)示例:强>
UNSIGNED
答案 4 :(得分:1)
我想补充一点,如果你要存储一个非常大的数字,如902054990011312,那么人们可以很容易地看到INT(20)
和BIGINT(20)
的区别。建议存储在BIGINT
。
答案 5 :(得分:0)
让我们给一个带有zerofill关键字的int(10)示例,一个不是,表格喜欢:
create table tb_test_int_type(
int_10 int(10),
int_10_with_zf int(10) zerofill,
unit int unsigned
);
让我们插入一些数据:
insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647)
;
然后
select * from tb_test_int_type;
# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'
我们可以看到
使用关键字zerofill
,num小于10将填0,但没有zerofill
则不会
其次使用关键字zerofill
,int_10_with_zf变为unsigned int类型,如果插入减号,则会得到错误Out of range value for column.....
。但是你可以将减号插入int_10。此外,如果您将4294967291插入int_10,您将收到错误Out of range value for column.....
结论:
没有关键字zerofill
的int(X)等于int范围-2147483648~2147483647
带有关键字zerofill
的int(X),该字段等于unsigned int范围0~4294967295,如果num的长度小于X,则它将向左填充0