Answers:
见http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html
INT
是一个四字节有符号整数。
BIGINT
是一个八字节有符号整数。
它们各自接受的值不超过可以存储在其各自字节数中的值。表示中的2 32个值INT
和中的2 64个值BIGINT
。
20 in INT(20)
和BIGINT(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)
。不是这种情况。
bar INT ZEROFILL(20)
。这本来应该清楚得多。但是这个决定是很久以前做出的,现在更改它会破坏数百万个数据库的安装。
类型声明中括号内的数字是display width,它与可以存储在数据类型中的值的范围无关。仅仅因为您可以声明Int(20)
并不意味着您可以在其中存储最多10 ^ 20的值:
[...]应用程序可以使用此可选显示宽度来显示整数值,该整数值的宽度小于为列指定的宽度,方法是用空格左键填充它们。...
显示宽度不限制可以存储在该列中的值的范围,也不限制宽度超出该列指定值的值所显示的位数。例如,指定为SMALLINT(3)的列通常具有-32768到32767的SMALLINT范围,并且使用三个以上的字符来显示三个字符所允许的范围之外的值。
有关每个MySQL数据类型中可以存储的最大值和最小值的列表,请参见此处。
引用:
“ BIGINT(20)”规范不是数字限制。它仅表示在显示数据时,如果使用的数字少于20位,则将在其后填充零。2 ^ 64是BIGINT类型的硬限制,它本身具有20位数字,因此BIGINT(20)意味着小于10 ^ 20的所有内容都将在显示时保留空格。
据我所知,只有一个小的区别是您尝试插入超出范围的值。
在实施例I将使用
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)
我想补充一点是,如果你存储一个真正的大数字,如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
,小于10的num将填充0,但如果没有zerofill
,则不会填充0
其次,使用关键字zerofill
int_10_with_zf成为无符号的int类型,如果插入减号,则会得到error Out of range value for column.....
。但是您可以在int_10处插入减号。另外,如果将4294967291插入int_10,也会收到错误消息Out of range value for column.....
结论:
不带关键字的int(X)zerofill
等于int范围-2147483648〜2147483647
int(X)with keyword zerofill
,该字段等于unsigned int范围0〜4294967295,如果num的长度小于X,它将在左侧填充0