我想知道BigInt, MediumInt和Int之间的区别是什么…很明显,他们会考虑到更大的数字;然而,我可以使一个Int(20)或BigInt(20),这将使它看起来不一定是关于大小。
如果能有洞察力就太好了,只是有点好奇。我已经使用MySQL有一段时间了,并试图在选择类型时应用业务需求,但我一直不了解这方面。
我想知道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))是一个常见的困惑来源。事实并非如此。