我应该为我的自动增量 ID MySQL 使用啥大小的 INT

Posted

技术标签:

【中文标题】我应该为我的自动增量 ID MySQL 使用啥大小的 INT【英文标题】:What size INT should I use for my autoincrement ids MySQL我应该为我的自动增量 ID MySQL 使用什么大小的 INT 【发布时间】:2011-04-03 12:39:27 【问题描述】:

目前,我们对超过 30 个表数据库中的所有自动增量 id 列使用 INT(21)*。

我们是一个博客网站,并且有存储成员、cmets、博客文章等的表格。

我很确定我们永远不会达到 INT(21) id 列的限制,并且想知道:

如果在我确信我们永远不需要的时候使用 INT(21) 会浪费空间 如果是浪费,自动增量 id 列的推荐大小是多少

*不是我的设计。我问这个是因为我正在考虑将其简化为 INT(10)。

【问题讨论】:

【参考方案1】:

value within the brackets is the display width。

[It] 可以被应用程序用来显示宽度小于为列指定的宽度的整数值,方法是用空格向左填充它们。 (也就是说,这个宽度存在于结果集返回的元数据中。是否使用它取决于应用程序。)

显示宽度不限制可存储在列中的值的范围,也不限制宽度超过为列指定的值显示的位数。例如,指定为 INT(3) 的列的 INT 范围通常为 -2147483648 到 2147483647,超出三个字符允许范围的值使用三个以上的字符显示。

结论

INT(10)INT(21),不会影响可以存储的值。如果您真的有顾虑,可以轻松地将数据类型更改为 BIGINT,而不会产生我所知道的影响。我会查看在给定时间段内(即一个月)创建了多少新记录,并根据该历史记录查看最大化 INT 值需要多长时间。

【讨论】:

感谢您的详细回答和链接。在这种情况下,我的无知已经被根除。 只是一个说明,上个月一位同事注意到在尝试输入 11 位数字时 int 数字变为一个奇怪的数字,当然该列设置为 int(10),我被告知该数字永远不会超过 10 位,但它发生了,从 10 增加到 11 并生成一个重复的数字,谢谢 G 不是 id 列,但我的问题是,如果 id 设置为 int 会发生什么(11) 是否超标?奇怪数字的一个例子是从 12345678901 返回的编号是 234567891 或类似的东西。【参考方案2】:

每个int类型的限制见这里:http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

请注意INT(21) == INT(100000)。括号中的数字是如果您指定字段应填充零,则填充多少个零。

未签名的int 字段最多可容纳 4294967295 条记录(请参阅上面的链接)。

【讨论】:

【参考方案3】:

不用担心占用太多空间,空间很便宜。选择您知道不会超过的列类型。当您选择 smallint 以节省空间时,您会自责,当您的数据库不再保存数据时会遇到问题。

【讨论】:

如果我们的数据库空间不足,我们将拥有 4294967295 个成员。那我就踢自己好了,一路踢到银行:)

以上是关于我应该为我的自动增量 ID MySQL 使用啥大小的 INT的主要内容,如果未能解决你的问题,请参考以下文章

CockroachDB 中的自动增量支持

我应该为我的基类使用实体框架上的啥继承策略?

MySQL 和自动增量一致性

如何更改 MySQL 中的自动增量计数器?

hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?

Mysql IN子句与自动增量ID的范围