MySQL中的类型:BigInt(20)vs Int(20)

时间:2010-06-28 20:14:59

标签: mysql types

我想知道BigIntMediumIntInt之间的区别是什么......显然他们会允许更大的数字;但是,我可以制作一个Int(20)BigInt(20),这看起来似乎不一定是大小。

有些洞察力会很棒,只是有点好奇。我一直在使用 MySQL 并尝试在选择类型时应用业务需求,但我从未理解这方面。

6 个答案:

答案 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)

Quote

  

“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.....

结论:

  1. 没有关键字zerofill的int(X)等于int范围-2147483648~2147483647

  2. 带有关键字zerofill的int(X),该字段等于unsigned int范围0~4294967295,如果num的长度小于X,则它将向左填充0