MySQL中数据类型INT(11)和UNSIGNED INT(10)有什么区别?

56

在MySQL中,如果我们创建一个数据类型为INT的字段,并且不指定任何长度/值,则它会自动变成int(11)。如果我们设置属性UNSIGNEDUNSIGNED ZEROFILL,则它会变成int(10)

那么这个length(1)是什么意思呢?

3个回答

78

整型值可以是-2147483648,这些是11位数字,因此默认的显示大小为11

无符号整数不允许负数,因此默认情况下只需要显示大小为10

如下面的文档所示,存储SIGNED INT和UNSIGNED INT所需的位数相同,可存储数字范围仅被移动:

可以使用无符号类型来在列中仅允许非负数或当您需要更大的上限数字范围的列时。例如,如果一个INT列是UNSIGNED,则该列的范围大小相同,但其端点从-2147483648和2147483647移动到0和4294967295。

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


3
非常感谢,顺便说一下我也来自比卡尔 :) - xkeshav
@diEcho:太好了,我们都来自同一地方。很高兴在SO上和你交流。 - Shakti Singh
大家好,拉贾斯坦人 :).. 你们的帖子仍在帮助我们 :) - Ravikumar Sharma
1
所以如果我理解正确,数值(10或11)与为此列分配的内存大小无关,而是允许形成数字的字符数?因此,将列设置为UNSIGNED INT(11)不会比UNSIGNED INT(10)允许更多的数字? - Prusprus

24
根据文档,这个数字仅仅是显示宽度
例如,INT(4)指定了一个带有四个数字的INT的显示宽度。 显示宽度不限制可以存储在列中的值的范围。 它也不会阻止比列显示宽度更宽的值正确显示。例如,将列指定为SMALLINT(3)具有通常的SMALLINT范围-32768到32767,并且超出三个数字允许的范围的值将使用超过三个数字的完整形式显示。 UNSIGNED INT默认显示宽度比非UNSIGNED INT少一位,因为您永远不会显示 - 字符。
请注意,您仍然可以指定任何显示宽度。 这只是默认值
文档中“digits”一词在这里略微误导。

1
太好了。这意味着显示宽度,而不是值的范围。 - blio

10

如果有人不太理解Shakti的回答(就像我一样),这里是一个视觉化表示:

 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

保存值的空间与此无关。这只是“显示宽度”,并且不以任何方式限制存储的值。 - Lightness Races in Orbit
3
有符号的最大值不是2^32-1,而是2^31-1,因为有一位用于表示符号,所以无符号最大值不等于有符号最大值。 - Julien Palard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接