我想知道BigInt, MediumInt和Int之间的区别是什么…很明显,他们会考虑到更大的数字;然而,我可以使一个Int(20)或BigInt(20),这将使它看起来不一定是关于大小。

如果能有洞察力就太好了,只是有点好奇。我已经使用MySQL有一段时间了,并试图在选择类型时应用业务需求,但我一直不了解这方面。


当前回答

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

其他回答

引用:

“BIGINT(20)”规范不是数字限制。这只是意味着,当数据显示时,如果它使用的数字少于20位,它将用零填充左侧。2^64是BIGINT类型的硬限制,它本身有20位数字,因此BIGINT(20)只是意味着小于10^20的所有内容都将显示为空格。

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

让我们举一个int(10)的例子,一个有zerofill关键字,一个没有,表格是这样的:

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变成无符号int类型,如果你插入一个减号,你会得到一个错误,跳出列......的范围值但是你可以在int_10中插入减号。此外,如果您将4294967291插入到int_10,则会为列.....得到超出范围值的错误

结论:

int(X)不带关键字zerofill,等于int范围-2147483648~2147483647 int(X),关键字zerofill,字段等于无符号int范围0~4294967295,如果num的长度小于X,它将在左边填充0

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

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

它们各自接受的值不多于也不少于它们各自的字节数所能存储的值。这意味着INT类型有232个值,BIGINT类型有264个值。

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))是一个常见的困惑来源。事实并非如此。

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

[...] This optional display width may be used by applications to display integer values having a width less than the width specified for the column by left-padding them with spaces. ... The display width does not constrain the range of values that can be stored in the column, nor the number of digits that are displayed for values having a width exceeding that specified for the column. For example, a column specified as SMALLINT(3) has the usual SMALLINT range of -32768 to 32767, and values outside the range allowed by three characters are displayed using more than three characters.

关于每个MySQL数据类型中可以存储的最大值和最小值的列表,请参见这里。