MySQL中的types:BigInt(20)vs Int(20)

我想知道BigInt,MediumInt和Int之间的区别是什么……看起来很明显,他们会允许更大的数字; 然而,我可以做一个Int(20)或者一个BigInt(20),这看起来不一定就是规模。

有些洞察力是真棒:),只是有点好奇。 我一直在使用mysql一段时间,并试图应用业务需求时,selecttypes,但我从来没有明白这方面。

请参阅http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

INT是一个四字节的有符号整数。 BIGINT是一个八字节的有符号整数。

INT(20)和BIGINT(20)中的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),这是一个常见的混淆来源。

types声明中括号中的数字是显示宽度 ,它与可以存储在数据types中的值的范围无关。 仅仅因为你可以声明Int(20)并不意味着你可以存储高达10 ^ 20的值:

[…]这个可选的显示宽度可以被应用程序用来显示宽度小于为该列指定的宽度的整数值,方法是用空格填充它们。 …

显示宽度不限制可存储在列中的值的范围,也不限制显示宽度超过为列指定的值的位数。 例如,指定为SMALLINT(3)的列具有通常的SMALLINT范围-32768至32767,并且三个字符所允许的范围之外的值使用三个以上的字符显示。

有关可以存储在每个MySQL数据types中的最大值和最小值的列表,请参见此处

引用 :

“BIGINT(20)”规格不是数字限制。 这只是表示当显示数据时,如果使用less于20位数字,则将用零填充。 2 ^ 64是BIGINTtypes的硬性限制,本身有20个数字,因此BIGINT(20)意味着小于10 ^ 20的所有内容都将被显示空格。

我想再补充一点,如果你存储了一个非常大的数字,比如902054990011312,那么可以很容易看出INT(20)和BIGINT(20)的区别。 build议以BIGINT存储

据我所知,只有一个小的区别是当你试图插入超出范围的值。

在例子中,我将使用401421228216 ,这是101110101110110100100011101100010111000 (长度为39个字符)

  • 如果你有系统的INT(20) ,这意味着在内存中分配至less20位。 但是,如果插入的值大于2^20 ,则只有当它小于INT(32) -> 2147483647 (或UNSIGNED 2 * INT(32) -> 4294967295 )时才会成功存储。

例:

 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) 
  • 如果系统具有BIGINT(20) ,则表示在内存中分配最less20位。 但是,如果插入的值大于2^20 ,则对于UNSIGNED ,如果小于BIGINT(64) -> 9223372036854775807 (或2 * BIGINT(64) -> 18446744073709551615 ,则会成功存储。

例:

 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)