问答中心分类: MYSQLMySQL中的类型:BigInt(20)vs Int(20)
0
匿名用户 提问 1天 前

我想知道BigInt,MediumIntInt是很明显,他们会允许更多的人;然而,我可以Int(20)或aBigInt(20)这似乎与尺寸无关。
一些见解会很棒,只是有点好奇。我一直在使用MySQL有一段时间,我试图在选择类型时应用业务需求,但我从未理解这一方面。

5 Answers
0
John Feminella 回答 1天 前

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

[…] 应用程序可以使用此可选的显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格左键填充。。。
显示宽度不限制可存储在列中的值的范围,也不限制宽度超过为列指定宽度的值显示的位数。例如,指定为SMALLINT(3)的列通常的SMALLINT范围为-32768到32767,超出三个字符允许范围的值将使用三个以上的字符显示。

有关可以存储在每个MySQL数据类型中的最大值和最小值的列表,请参阅在这里.

0
OMG Ponies 回答 1天 前

引用:

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

Heath Hunnicutt 回复 1天 前

2^64(无符号)实际上有21个数字。BIGINT(20)很危险。使用它的人似乎以2^64可以容纳20位小数为理由来证明他们的使用。如果是这样,为什么还要指定宽度限制?事实证明,这也是不正确的。需要21位数字才能正确显示2^64。

drmercer 回复 1天 前

@除非我弄错了,否则2^64=18446744073709551616,有20个数字。你怎么说它有21个?

0
Sergey Podgornyy 回答 1天 前

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

在我将使用的示例中401421228216,即101110101110110100100011101100010111000(长度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)
0
Jayhello 回答 1天 前

让我们举一个int(10)one的例子,其中包含zerofill关键字,one not,该表如下所示:

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'

我们可以看到

  • with关键字zerofill,num小于10将填充0,但不包含zerofill不会的
  • 其次是关键字zerofill,int\u 10\u with\u zf变为无符号int类型,如果插入负号,则会出现错误Out of range value for column...... 但可以在int\u 10中插入负号。此外,如果将4294967291插入int\u 10,则会出现错误Out of range value for column.....

结论:

  1. 不带关键字的int(X)zerofill,等于int范围-2147483648~2147483647
  2. int(X)带关键字zerofill,该字段等于无符号整数范围0~4294967295,如果num的长度小于X,它将向左填充0
0
Debasis Sabat 回答 1天 前

我想补充一点,如果您存储的是一个非常大的数字,如9020549001312,那么您可以很容易地看到INT(20)BIGINT(20). 建议储存在BIGINT.