mysql的bigint类型_MySQL中的类型:BigInt(20)与Int(20)

我想知道BigInt,MediumInt和Int之间的区别是什么……似乎可以允许更大的数字;这似乎很明显。 但是,我可以制作一个Int(20)或一个BigInt(20),这似乎使它不一定与大小有关。

一些见识会很棒,只是有点好奇。 我使用MySQL已有一段时间,并在选择类型时尝试满足业务需求,但是我从不理解这一方面。

见http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html

INT是一个四字节有符号整数。

BIGINT是一个八字节有符号整数。

它们各自接受的值不超过可以存储在其各自字节数中的值。这意味着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))是一个普遍的困惑。不是这种情况。

哇,这篇帖子很好地消除了我对此主题的困惑。似乎是开发人员的一个奇怪选择-正如我猜想的是宽度+最大值或位/等。

`它仅影响ZEROFILL选项:`现在我的好奇心结束了

我真的希望他们设计的语法是在ZEROFILL而不是INT上显示的。示例:bar INT ZEROFILL(20)。这本来应该清楚得多。但是这个决定是很久以前做出的,现在更改它会破坏数百万个数据库的安装。

我同意这非常令人困惑。我一直以为这个数字一直都是极限。当我知道数据会在一定范围内时,甚至担心要减小一些数字。

@ jDub9,是的,更令人困惑的是NUMERIC / DECIMAL带有一个精度参数,该参数确实会影响值的范围和列的大小。

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

你是说这里

引用:

The"BIGINT(20)" specification isn't a digit limit. It just means that when the data is displayed, if it uses less than 20 digits it will be left-padded with zeros. 2^64 is the hard limit for the BIGINT type, and has 20 digits itself, hence BIGINT(20) just means everything less than 10^20 will be left-padded with spaces on display.

2 ^ 64(无符号)实际上有21位数字。 BIGINT(20)是危险的。使用它的人似乎以2 ^ 64可以包含20个十进制数字的想法来证明其用法是正确的。如果是这样,为什么还要指定宽度限制?事实证明,那也不是正确的。需要21位数字才能正确显示2 ^ 64。

据我所知,只有一个小的区别是您尝试插入超出范围的值。

In examples I'll use 401421228216, which is 101110101110110100100011101100010111000 (length 39 characters)

如果系统具有Int(20),则意味着在内存中分配最少20位。但是,如果您插入的值大于2^20,则只有小于INT(32) -> 2147483647(对于UNSIGNED为2 * INT(32) -> 4294967295)时,该值才能成功存储。

例:

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(对于UNSIGNED,则为2 * BIGINT(64) -> 18446744073709551615)

例:

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(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类型,如果插入减号,则会出现错误Out of range value for column.....。但是您可以在int_10处插入减号。另外,如果将4294967291插入int_10,也会得到错误Out of range value for column.....

结论:

不带关键字ZEROFILL的int(X)等于int范围-2147483648?2147483647

关键字ZEROFILL的int(X),该字段等于unsigned int范围0?4294967295,如果num的长度小于X,则它将在左侧填充0

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
### 回答1: Bigint类型可以存储比int类型更大的整数,Bigint类型可以存储范围从-9223372036854775808到9223372036854775807之间的数字,而int类型只能存储范围从-2147483648到2147483647之间的数字。 ### 回答2: MySQLbigint和int是整数数据类型的两个选项。它们之间的区别如下: 1. 数据范围:bigint的取值范围更广,可以存储的整数范围从-2^63到2^63-1,而int的取值范围从-2^31到2^31-1。这意味着bigint可以存储更大的整数值。 2. 存储空间:bigint需要更多的存储空间来存储相同数量的数据。bigint使用8个字节(64位),而int只使用4个字节(32位)。因此,如果要存储更大的整数数据集,bigint会占用更多的磁盘空间。 3. 性能:由于bigint使用更多的存储空间,它可能会在大量数据处理时影响查询的性能。相比之下,int数据类型可以更快地执行查询操作。 4. 应用场景:由于bigint可以存储更大的整数值,所以在处理需要大范围整数的应用程序时更常见。例如,在存储用户ID时,bigint可能更合适,因为用户ID可能会非常庞大。 总的来说,bigint和int之间的主要区别是存储范围和存储空间。根据具体的应用场景和需求,我们可以选择合适的数据类型来存储整数数据。 ### 回答3: BigInt和Int都是MySQL的整数数据类型,不同之处在于它们的存储范围和占用空间。 1. 存储范围: - Int是一个4字节(32位)有符号整数,其存储范围为-2,147,483,648到2,147,483,647。 - BigInt是一个8字节(64位)有符号整数,其存储范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。 2. 占用空间: - 由于BigInt的存储范围比Int更大,所以它需要更多的存储空间。Int占用4个字节(32位),而BigInt占用8个字节(64位)。 3. 适用场景: - 如果你的数据范围可以在Int的存储范围内完成,那么使用Int可能是更好的选择,因为它占用更少的空间。 - 如果你需要存储非常大的整数或需要更大的存储范围,那么使用BigInt是更合适的选择。 总结:BigInt提供了更大的存储范围,但相应地占用更多的存储空间。选择使用哪个数据类型取决于你的数据的范围和你对空间利用率的考虑。如果你不确定应该使用哪个数据类型,可以根据你的需求来评估并选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值