MySQL 数据类型 INT(11) 而 UNSIGNED INT(10)?

Posted

技术标签:

【中文标题】MySQL 数据类型 INT(11) 而 UNSIGNED INT(10)?【英文标题】:MySQL datatype INT(11) whereas UNSIGNED INT(10)? 【发布时间】:2011-07-12 12:14:24 【问题描述】:

mysql 中,如果我们创建 INT 的字段 dataType 并且没有指定任何长度/值,那么它会自动变为 int(11) 并且如果我们设置属性 UNSIGNEDUNSIGNED ZEROFILL 然后变成int(10)

这个length(1)去哪儿了?

【问题讨论】:

【参考方案1】:

int 值可以是 -2147483648 这些是 11 位数字,所以默认 display 大小是 11

unsigned int 不允许负数,所以默认情况下它只需要 display size 10

正如下面的文档所示,存储 SIGNED INT 和 UNSIGNED INT 所需的位数是相同的,可存储的数字范围只是移位了:

无符号类型可用于允许 列中只有非负数 或者当你需要更大的鞋面时 列的数值范围。为了 例如,如果一个 INT 列是 UNSIGNED, 列范围的大小是 相同,但它的端点从 -2147483648 和 2147483647 最高为 0 和 4294967295。

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

【讨论】:

非常感谢......顺便说一句,我也来自 Bikaner :) @diEcho:太好了,我们都来自同一个地方。很高兴在 SO 上与您交谈 Hello Rajasthanis :).. 你的帖子仍在帮助我们 :) 所以如果我理解正确的话,数值(10 或 11)与分配给该列的内存大小无关,但字符数允许形成数字?因此,将列设置为 UNSIGNED INT(11) 将不允许比 UNSIGNED INT(10) 更多的数字?【参考方案2】:

根据the documentation,这个数字只是显示宽度

例如,INT(4) 指定显示宽度为 4 的 INT 数字。

显示宽度不限制可取值范围 存储在列中。它也不会阻止比列更宽的值 显示宽度无法正确显示。例如,一列 指定为 SMALLINT(3) 的 SMALLINT 范围通常为 -32768 到 32767,三位数允许范围之外的值是 使用三个以上的数字完整显示。

UNSIGNEDINT默认显示宽度比非UNSIGNED INT 的显示宽度小一,因为您永远不会显示- 字符。

请注意,您仍然可以指定任何您喜欢的显示宽度。这只是默认

文档中“数字”一词的使用在这里有点误导。

【讨论】:

那太好了。表示显示宽度,不是取值范围。【参考方案3】:

以防有人不太了解Shakti's answer(因为我没有)。以下是原因的直观表示:

 Signed minimum:
 - 2 1 4 7 4 8 3 6 4  8
 1 2 3 4 5 6 7 8 9 10 11

 Unsigned max (also the signed max):
 4 2 9 4 9 6 7 2 9 5
 1 2 3 4 5 6 7 8 9 10

【讨论】:

保存值的空格与此无关。这只是显示宽度,不会以任何方式限制存储的值。 带符号的最大值不是 2^32-1 而是 2^31-1,因为符号只有一位,所以 unsigned max != signed max。

以上是关于MySQL 数据类型 INT(11) 而 UNSIGNED INT(10)?的主要内容,如果未能解决你的问题,请参考以下文章

MySql基础知识

MySQL 中的 CASE 强制列数据类型为 BIGINT 而不是 INT

MySQL数据库中 int 长度最大是多少?

mysql中 id 是int设为类型,长度为11,可是数据库中只能存储1000条记录。

MySQL的int (10) 和 int (11) 的区别

mysql数据类型/注意事项/int(20)混淆