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

Par*_*ris 201 mysql types

我想知道有什么差别BigInt,MediumIntInt是...这似乎很明显,他们将允许更大的数字; 但是,我可以制作一个Int(20)或一个BigInt(20),这似乎不一定是大小.

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

Bil*_*win 427

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

  • INT 是一个四字节有符号整数.

  • BIGINT 是一个8字节有符号整数.

它们每个接受的值不会超过它们各自的字节数.这意味着a中有2 32 值,a 中有INT2 64个BIGINT.

20英寸INT(20),BIGINT(20)几乎没有任何意义.这是显示宽度的提示.它与存储无关,也与列可接受的值范围无关.

实际上,它只影响ZEROFILL选项:

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

+----------------------+
| bar                  |
+----------------------+
| 00000000000000001234 |
+----------------------+
Run Code Online (Sandbox Code Playgroud)

这是MySQL用户看到INT(20)和假设它是一个大小限制的混淆的常见原因,类似于CHAR(20).不是这种情况.

  • `它只影响ZEROFILL选项:`现在我的好奇心结束了 (20认同)
  • 我真的希望他们用ZEROFILL而不是INT设计显示语法.示例:`bar INT ZEROFILL(20)`.它会更清楚.但是这个决定是很久以前做出的,现在更改它会破坏数百万个数据库安装. (4认同)
  • 哇,这篇文章完全清除了我对这个主题的困惑.看起来像开发人员的一个奇怪的选择 - 因为我猜测它是宽度+最大值,或位/等. (3认同)
  • @ jDub9,是的,更令人困惑的是NUMERIC / DECIMAL带有一个精度参数,确实会影响值的范围和列的大小。 (2认同)

Joh*_*lla 38

类型声明中括号中的数字是显示宽度,它与可以存储在数据类型中的值的范围无关.仅仅因为您可以声明Int(20)并不意味着您可以存储最多10 ^ 20的值:

[...]应用程序可以使用此可选显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格填充它们....

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

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


OMG*_*ies 14

Quote:

"BIGINT(20)"规范不是数字限制.它只是意味着当显示数据时,如果它使用少于20位数字,它将用零填充左边.2 ^ 64是BIGINT类型的硬限制,本身有20个数字,因此BIGINT(20)只意味着小于10 ^ 20的所有内容都将在显示屏上留空.

  • 2 ^ 64(无符号)实际上有21位数.BIGINT(20)很危险.使用它的人似乎证明了他们的使用是因为2 ^ 64适合20个十进制数字.如果是这种情况,为什么要指定宽度限制?事实证明,这也是不正确的.正确显示2 ^ 64需要21位数. (3认同)