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

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


当前回答

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

在示例中,我将使用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)

其他回答

类型声明中圆括号中的数字是显示宽度,它与数据类型中可以存储的值的范围无关。仅仅因为你可以声明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数据类型中可以存储的最大值和最小值的列表,请参见这里。

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

引用:

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

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

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

在示例中,我将使用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)