【问题标题】:int(11) vs. int(anything else)int(11) 与 int(其他)
【发布时间】:2011-09-26 08:05:43
【问题描述】:

我是网络编程的新手,正在学习可以在网上找到的不同教程。

我进行了研究,发现在 int(11) 中,11 是整数的最大显示宽度,除非整数是 UNSIGNED(在本例中为 10),否则它是默认值。

当我看到这样的东西时:

id INT(11) not null AUTO_INCREMENT

我没有问题。但是为什么我在不同的教程中看到不同的东西呢?例如,在某些情况下,它说,

id INT(10) not null AUTO_INCREMENT

甚至

id INT(4) not null AUTO_INCREMENT

这些 tuts 的作者想要达到什么目的?他们似乎都懒得解释 10 或 4 的含义。

好吧,它们显然是在减小显示宽度,但为什么呢?默认宽度 11 有什么问题?他们为什么要改变它?还是有其他我不知道的原因?

谢谢。

【问题讨论】:

标签: mysql


【解决方案1】:

INT(x) 中的x 与空间要求或任何其他性能问题无关,它实际上只是显示宽度。通常,将显示宽度设置为合理的值对于 UNSIGNED ZEROFILL 选项最有用。

//INT(4) UNSIGNED ZEROFILL
0001
0002 
...
0099
...
0999
...
9999
...
10000

//INT(2) UNSIGNED ZEROFILL
01
02 
...
09
...
99
...
100

如果没有 UNSIGNED ZEROFILL 选项,该值将在左侧填充空格以达到适当的显示宽度。

//INT(4)
   1
   2 
...
  99
...
 999
...
9999
...
10000

//INT(2)
 1
 2 
...
 9
...
99
...
100

【讨论】:

    【解决方案2】:

    不是性能提升也不是最大允许大小的差异。

    在对该列应用 ZEROFILL 时使用。 (见:http://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/

    【讨论】:

    • 根本没有节省磁盘空间,只是显示宽度,在磁盘上以相同的方式保存。
    【解决方案3】:

    数字只是一个表示选项,称为“显示宽度”。在显示数字数据类型时,某些应用程序可能会使用它来填充字段。

    int 大小既不是位也不是字节。它只是显示宽度,当字段指定了 ZEROFILL 时使用。

    这个blog解释了MySQL中int(size)的含义。

    【讨论】:

      【解决方案4】:

      来自the docs

      “应用程序可以使用此可选显示宽度显示宽度小于为列指定宽度的整数值,方法是用空格向左填充它们。(即,此宽度为存在于与结果集一起返回的元数据中。是否使用取决于应用程序。)”也就是说,int(4) 礼貌地要求将 123 显示为“123”。不知道有多少事情真正引起了人们的注意,也不知道为什么他们会在教程中费心。

      “显示宽度不限制可以存储在列中的值的范围。它也不会阻止比列显示宽度更宽的值正确显示。”因此,如果您将 123456 推入 int(4),它仍然是 123456

      与磁盘空间或性能无关,只是提示应用程序检索它希望以至少 N 位显示的数据。

      相关的 ZEROFILL 选项可以结合使用来实际填充返回的数据。所以int(4) ZEROFILL 中的 123 返回为 0123。

      【讨论】:

        【解决方案5】:

        是的,它指定了显示宽度,只有在指定ZEROFILL 时才起作用。所以那时它可以用所需数量的零填充字段值。

        【讨论】:

        • 这就是我感兴趣的原因。因为,我在这些教程的代码中没有看到 ZEROFILL,但我确实看到了不同的 int 值。
        • 是的,在我阅读之前,我认为这就像对整数大小的限制。这里有一个很好的解释 - alexander.kirk.at/2007/08/24/…
        【解决方案6】:

        我同意 MySQL 手册对整数的长度/显示宽度有点模糊。您可能认为这将您可以存储在列中的值限制为位数,但列的有效范围不会改变,无论您将其设置为 1 还是 11。

        它真正做的是确定列值的显示宽度。唯一有用的情况是,如果您使用 ZEROFILL 用零填充您的值。

        因此,就您可以在列中存储的内容而言,INT(1) 和 INT(11) 之间基本上没有真正的区别,唯一相关的情况是您想要对值进行清零。

        更多信息:
        http://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/
        http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

        【讨论】:

          【解决方案7】:

          从这个blog article复制:

          MySQL 有一个鲜为人知的数字类型特性,称为 zerofill。此功能会影响数字类型的显示大小。与字符串类型不同,括号内的数字不是该类型的字符存储大小。对于数字类型,类型名称本身决定了存储大小。

          整数类型,它是 zerofill 的填充大小。

          【讨论】:

            猜你喜欢
            • 2011-10-11
            • 2011-07-11
            • 2011-07-11
            • 2019-11-29
            • 1970-01-01
            • 2016-09-25
            • 2011-08-14
            • 2020-09-10
            • 2018-11-15
            相关资源
            最近更新 更多