【问题标题】:What does the number in parenthesis really mean?括号中的数字究竟是什么意思?
【发布时间】:2011-05-02 14:49:44
【问题描述】:

一直以为括号里的数字代表字段长度

但是,我知道情况并非总是如此。也许这是一个MySQL问题?有人告诉我,如果我将字段设置为 9 个字符长,我可以添加一个超过 9 个字符的值,但只会保存前 9 个字符。

例子:

CREATE TABLE `person` (
    id INT,
    age INT(2)
);

如果是这种情况,我不应该选择 TINYINT 而不是 INT 作为年龄吗?

【问题讨论】:

    标签: mysql sql ddl


    【解决方案1】:

    INT(2) 将生成一个带有 minimum display width of 2 的 INT:

    MySQL 支持扩展,用于在类型的 base 关键字后面的括号中可选地指定整数数据类型的显示宽度。例如,INT(4) 指定显示宽度为四位的 INT。应用程序可以使用这个可选的显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格向左填充它们。 (也就是说,这个宽度存在于结果集返回的元数据中。是否使用取决于应用程序。)

    显示宽度不限制可以存储在列中的值的范围。它也不会阻止正确显示比列显示宽度更宽的值。例如,指定为 SMALLINT(3) 的列的 SMALLINT 范围通常为 -32768 到 32767,超出三位数允许范围的值将使用多于三位数完整显示。

    不会影响可以存储在字段中的可能值的范围;它也不是用于存储它的字节数。除非使用ZEROFILL,否则似乎只是对应用程序如何显示值的建议(请参阅链接页面)。

    一个未签名的TINYINT (0...255) 可能也可以,除非cryopreservation 在您的应用程序的生命周期中向前迈出了一大步。

    【讨论】:

    • 它继续说:“显示宽度不限制可以存储在列中的值的范围。也不会阻止比列显示宽度更宽的值正确显示。”跨度>
    • 那么为什么还要暗示该字段的值最多为 2?我认为这与mysql内部值的长度无关,对吗?这只是一个展示的东西。
    • @luckytaxi 不,对于varchar,它是一个值可以采用的实际最大宽度。
    • @Pekka 您的链接已损坏。该页面仍然存在,但不再包含任何单词“最小”、“显示”或“宽度”。看起来他们已将其移至 Overview 页面。我会提议进行编辑,但我不确定如何处理您引用的原始文本。对我来说似乎值得保留。
    • 我还是不明白。 int(11) 是一个整数值,它与填充有什么关系?我认为填充是用于字符类型的。官方文档说“int(4) zerofill”将返回值 5 作为 '0005'。但是int是整数值,怎么会有padding 0呢?
    【解决方案2】:

    对于像 vchar 这样的字段类型就是这种情况,但对于数字,它表示它用来表示数字的字节数。两个字节的整数意味着您可以保存一个数字 2^16 - 1(一个字节中有 8 位,因此总共 16 个)。如果它的年龄,我认为你应该是安全的两个字节。 ;)

    【讨论】:

    • 我以前认为(2)也代表字节,但它是不正确的。
    • 啊好吧,所以它更适合 vchar。所以如果我想显示 SSN,我不应该这样做ssn INT(9)
    • 显然我弄错了。听佩卡。 o.O
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 2014-10-29
    • 2016-01-27
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多