【问题描述】:

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

这个 length(1) 去哪儿了?

【问题讨论】:

    标签: mysql types int unsigned-integer


    【解答1】:

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

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

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

    <1234565>

    无符号类型可用于允许 列中只有非负数 或者当你需要更大的鞋面时 列的数值范围。为了 例如,如果一个 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】:

    以防有人不太了解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。
    【解答3】:

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

    <1234565>

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

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

    UNSIGNED INT默认 显示宽度比非 UNSIGNED 的显示宽度小一 < code>INT 只是因为你永远不会显示 - 字符。

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

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

    【问题讨论】:

    • 太好了。表示显示宽度,不是取值范围。