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

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


当前回答

引用:

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

其他回答

让我们举一个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

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

在示例中,我将使用401421228216,即10111010111110110100100011101100010111000(长度为39个字符)

如果你有INT(20)的系统,这意味着在内存中分配最少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)

如果你有BIGINT(20)系统,这意味着在内存中分配最少20位。但如果你插入的值大于2^20,它将被成功存储,如果它小于BIGINT(64) -> 9223372036854775807(或2 * BIGINT(64) -> 18446744073709551615对于UNSIGNED)

例子:

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)

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

引用:

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

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