【问题标题】:What is the size of column of int(11) in mysql in bytes?mysql 中 int(11) 列的大小(以字节为单位)?
【发布时间】:2011-08-03 19:05:38
【问题描述】:

mysql中int(11)的列大小是多少?

以及可以存储在此列中的最大值?

【问题讨论】:

  • @cellepo 一个是通用的 sql,另一个是特定于 mysql 的(加上这个有更多的视图)。如果您想进行欺骗搜索并让我在一票中快速关闭它们,请访问SOBotics聊天并联系我。但是要关闭的必须在我到达之前标记mysql。谢谢
  • 嘿,伙计们。它可能是重复的,但它对搜索更友好。大多数人确实使用 int(11) 进行搜索。它正在解决其他人的问题。您可以检查其与其他视图相比的视图数量。用户将在这里找到更详细的答案。

标签: mysql types int


【解决方案1】:

INT(x)会有所不同仅在显示方面,即在x中显示数字em> 位,并且不限于 11。您可以使用 ZEROFILL 配对它,这将在前面添加零,直到它与您的长度匹配。

所以,对于INT(x)中的任意数量的x

  • 如果存储值的位数少于xZEROFILL 将在前面添加零。

INT(5) ZEROFILL 存储值为 32 将显示 00032
INT(5) 存储值为32 将显示 32
INT 存储值 32 将显示 32

  • 如果存储的值的位数多于x,则按原样显示。

INT(3) ZEROFILL 存储值为 250000 将显示 250000
INT(3) 存储值为250000 将显示 250000
INT 存储值 250000 将显示 250000

存储在数据库中的实际值不受影响,大小保持不变,任何计算都会正常运行。

这也适用于BIGINTMEDIUMINTSMALLINTTINYINT

【讨论】:

  • 所以除非你使用 zerofill,否则长度绝对不会起作用?
  • @developerbmw - 正确。除非您使用 ZEROFILL,否则长度绝对不会起作用。
  • ZEROFILL 本质上是大型机兼容模式。
  • ZEROFILL 的另一个副作用是它会隐式地使您的专栏成为UNSIGNED。所以你不能在那个 zerofill-ed 列上使用负值。
【解决方案2】:

无论指定什么长度,INT 始终为 4 个字节。

  • TINYINT = 1 字节(8 位)
  • SMALLINT = 2 个字节(16 位)
  • MEDIUMINT = 3 个字节(24 位)
  • INT = 4 字节(32 位)
  • BIGINT = 8 字节(64 位)。

长度只是指定使用 mysql 命令行客户端选择数据时要填充的字符数。存储为 int(3) 的 12345 仍将显示为 12345,但如果将其存储为 int(10),它仍将显示为 12345,但您可以选择填充前五位数字。例如,如果您添加了ZEROFILL,它将显示为 0000012345。

...最大值将为 2147483647(有符号)或 4294967295(无符号)

【讨论】:

  • 那么这里的 int(11) 中的 11 是什么意思。
  • Column INT(4),只有当该列也被指定为 zerofill 时,整数 1 才会显示为 0001。否则,它将仅显示为数字 1,没有多余的数字。 @Gaurav - 不要混合mysql如何显示数据和它如何存储数据,这是两件不同的事情。你看到的并不是它的真实样子。
  • @Michael 哇,真的很有趣。所以如果你创建一个 INT(3) 列并存储一个值 5001,它将存储 5001 但只显示 1。我不知道。
  • @andrewtweber:5001 将显示为 5001,即使字段定义为 INT(3)。请参阅下面的@priyabagus answerhere
  • 如果你不提供整数字段的长度,MySQL会设置一个默认值(tinyint 4, smallint 6, mediumint 9, int 11, bigint 20)值得注意的是这些默认值长度足以显示可以存储在此字段中的任何数字(例如:smallint 最大值为 2^16 = 65536,5 位)除非您有充分的理由这样做,否则我建议保留默认大小以避免意外。
【解决方案3】:

正如其他人所说,列可以存储的最小/最大值以及它以字节为单位的存储量仅由类型定义,而不是长度。

很多这些答案都说(11) 部分只影响显示宽度,这并不完全正确,但主要是。

未指定填零int(2)定义将:

  • 仍然接受100的值
  • 输出时仍显示100(不是000
  • 显示宽度将是选择查询输出的最大值的宽度。

(2) 唯一会做的是如果还指定了 zerofill

  • 1 的值将显示为01
  • 在显示值时,列的宽度总是列可以采用的最大可能值,即 10 位整数,而不是显示最大值所需的最小宽度列需要在该特定选择查询中显示,这可能要小得多。
  • 列仍然可以取,并显示超过长度的值,但这些值不会以 0 为前缀。

查看所有细微差别的最佳方法是运行:

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `int1` int(10) NOT NULL,
    `int2` int(3) NOT NULL,
    `zf1` int(10) ZEROFILL NOT NULL,
    `zf2` int(3) ZEROFILL NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mytable` 
(`int1`, `int2`, `zf1`, `zf2`) 
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);

select * from mytable;

将输出:

+----+-------+-------+------------+-------+
| id | int1  | int2  | zf1        | zf2   |
+----+-------+-------+------------+-------+
|  1 | 10000 | 10000 | 0000010000 | 10000 |
|  2 |   100 |   100 | 0000000100 |   100 |
+----+-------+-------+------------+-------+

此答案针对 Linux 的 MySQL 5.7.12 进行了测试,可能会或可能不会因其他实现而异。

【讨论】:

  • "注意 int1 列的显示宽度比 zerofill2 小得多,即使长度更大" ... 嗯,这只是因为列名 'zerofill2' 的长度为 9 个字符,而 'int1' 4.
  • ... 是的,所以显然长度没有影响,即使在未启用 zerofill 时显示宽度也是如此。否则 int1 会宽得多,宽度为 10 个字符。
  • 一个很好的解释和一个可靠的例子。比接受的答案更好的答案。谢谢@Programster。
  • 次要问题:正如 neokio 指出的那样,无法从该查询中观察到“int(3)”填充为零的确切后果。将列名缩短为“zf2”,以使行为更清晰。具体来说,无论是真还是假[在给定的数据库版本上],“(使用 zerofill)显示值时,列的宽度始终为该列可以采用的最大可能值的宽度,对于整数来说是 10 位数字,”
  • 澄清neokio的评论和我的次要评论:句子“注意int1列的显示宽度比zerofill2小得多,即使长度更大。”应该是从答案中删除。这是标题词“zerofill2”中字符数的结果 - 它与测试显示宽度无关。最好给该列一个较短的名称,例如“zf2”。然后我们会有一个表格,其中“int1、int2 和 zf2 的宽度都完全相同,即使 int2 和 zf2 指定了一个小宽度 (3)”。
【解决方案4】:

mysql 中 int(11) 列的大小(以字节为单位)?

(11) - int 数据类型的这个属性与列的大小无关。它只是整数数据类型的显示宽度。来自11.1.4.5. Numeric Type Attributes

MySQL 支持扩展以可选地指定显示 base 关键字后面括号中整数数据类型的宽度 对于类型。例如,INT(4) 指定一个带显示的 INT 四位数的宽度。

【讨论】:

    【解决方案5】:

    可以在here找到一个很好的解释

    总结:int(N) 中的数字 N 经常被列允许的最大大小混淆,就像在 varchar(N) 的情况下一样。

    但是对于整数数据类型,情况并非如此- 括号中的数字 N 不是列的最大大小,而只是一个参数,用于告诉 MySQL 在何时显示列的宽度正在通过 MySQL 控制台查看表的数据(当您使用 ZEROFILL 属性时)。

    括号中的数字将告诉 MySQL 用多少个零填充传入的整数。例如:如果您在设置为 INT(5) 的列上使用 ZEROFILL 并插入数字 78,MySQL 将用零填充该值,直到该数字满足括号中的数字。即78将变为00078,127将变为00127。总结一下:括号中的数字用于显示目的。
    在某种程度上,除非您使用 ZEROFILL 属性,否则括号中的数字是无用的。

    因此 int 的大小将保持不变,即 -2147483648 到 2147483648 用于已签名0 到 4294967295 用于未签名(约 21.5 亿和 42 亿,这是其中之一开发人员仍然不知道括号中数字 N 背后的故事的原因,因为它几乎不会影响数据库,除非它包含超过 20 亿行),并且就字节而言,它将是 4 字节

    有关整数类型大小/范围的更多信息,请参阅MySQL Manual

    【讨论】:

    • 为什么行数在这里起作用?
    • @OldGeezer - 同意,“行数”与大多数列无关。仅与自动递增的主键 (id) 列相关。
    【解决方案6】:

    据此book

    MySQL 允许您为整数类型指定“宽度”,例如 INT(11)。 这对大多数应用程序来说是没有意义的:它不限制 值的合法范围,但仅指定字符数 MySQL 的交互工具将保留用于显示目的。为了 存储和计算目的,INT(1) 与 INT(20) 相同。

    【讨论】:

      【解决方案7】:

      虽然这个答案不太可能被看到,但我认为以下澄清是值得的:

      • MySQL 中整数数据类型后面的 (n) 是指定显示宽度
      • 显示宽度不限制查询返回的数字的长度
      • 显示宽度确实会限制填充为零的列的零填充数量,因此总数与显示宽度匹配(只要实际数字不超过显示宽度,在这种情况下,数字会按原样显示)
      • 显示宽度也是一个有用的工具,让开发人员知道应该将值填充到什么长度

      一点细节
      显然,显示宽度旨在提供一些关于在零填充数字中显示多少个零的元数据。
      如果从查询返回的数字超出指定的显示宽度,它实际上不会限制该数字的长度。
      要了解 MySQL 中整数数据类型实际允许的长度/宽度,请参见列表和链接:(types: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT);
      因此,如上所述,您可以预期显示宽度对标准查询的结果没有影响,除非列被指定为 ZEROFILL 列

      如果数据被拉入应用程序并且该应用程序正在收集显示宽度以用于其他类型的填充。

      主要参考:https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean

      【讨论】:

      • 感谢您提供正确的答案。我正在从 MySQL 命令行尝试,但我无法让它用小的 n 删除任何数字,所以......是的,那是废话。它只对 zerofill 做任何事情。
      • @mpen 很高兴我能提供帮助,这与我正在尝试的事情有关,我想我可以在这里提供更多关于它的细节,这可能对其他人有用。
      【解决方案8】:

      在 MySQL 中,整数 int(11) 的大小为 4 字节,等于 32 位。

      签名值为:-2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

      无符号值为:0 to 2^32-1 = 0 to 4294967295

      【讨论】:

        【解决方案9】:

        4294967295 是答案,因为 int(11) 显示最多 11 位 IMO

        【讨论】:

          【解决方案10】:

          我认为 int(11) 的最大值是 4294967295

          【讨论】:

          • 它是 2147483647 因为它有符号。
          【解决方案11】:

          根据hereint(11) 将占用 4 字节空间,即 32 位空间,最大值为 2^(31) = 2147483648-2147483648最小值。一位是符号。

          【讨论】:

          • 您的示例有 9 个 9。你能确认你的例子是正确的吗?如果是这样,为什么当有 9 个 9 时它会说 10?是位数加一加符号吗?
          • 不,如果 unsigned int,最大数量为 4294967295,即 2^32。括号中的数字不影响存储类型。如果需要超过 2^32,则需要去 bigint。
          • +Kieran 是对的。最大数量与答案中的不同。见here
          猜你喜欢
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          • 2014-01-27
          • 2018-01-01
          • 2016-03-19
          相关资源
          最近更新 更多