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


488

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

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



1
@cellepo一个是通用sql,另一个是mysql特有的(另外,这个还有更多视图)。如果您想进行欺骗,并希望我迅速将其一票关闭,请访问SOBotics聊天并ping我。但是要关闭的人必须mysql在我到达之前加标签。Thx
Drew

6
大家好。它可能是重复的,但对搜索更友好。大多数人确实使用int(11)进行搜索。它正在解决其他人的问题。您可以查看与其他视图相比的视图数量。用户将在这里找到更详细的答案。
Gaurav

Answers:


684

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

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

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

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


111
那么这里int(11)中11的含义是什么。
Gaurav

73
如果列INT(4)中的整数1也被指定为填零,则整数1将仅显示为0001。否则,它将仅显示为数字1,没有多余的数字。@Gaurav-不要混淆mysql如何显示数据以及如何存储数据,这是两件事。您所看到的并不是真正的样子。
Michael JV

13
@Michael Wow,真的很有趣。因此,如果创建列INT(3)并存储值5001,它将存储5001,但仅显示1。我不知道。
andrewtweber 2012年

16
@andrewtweber:即使50015001字段定义为,也将显示为INT(3)。请参阅下面和此处的 @priyabagus 答案
go2null16年

10
如果您没有为整数字段提供长度,MySQL将设置默认值(tinyint 4,smallint 6,mediumint 9,int 11,bigint 20)。值得注意的是,这些默认长度足以显示任何可以存储在此字段中(例如:smallint最大值为2 ^ 16 = 65536,5位数字)除非您有充分的理由这样做,否则我建议您保留默认大小,以免出现意外情况。
Thibault Witzig'1

167

INT(x仅在显示方面有所不同,即以x位显示数字,并且不限于11。您可以使用进行配对ZEROFILL,它将以零开头,直到匹配您的长度。

因此,对于任何数量的XINT(x)

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

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

  • 如果存储的数值比x多,它将按原样显示。

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

数据库中存储的实际值不受影响,大小仍然相同,任何计算都将正常进行。

这也适用于BIGINT,MEDIUMINT,SMALLINT和TINYINT。


49
因此,长度绝对不做任何事情,除非您使用Zerofill?
developerbmw

29
@developerbmw-正确。除非您使用长度,否则绝对不会做任何事情ZEROFILL
里克·詹姆斯

ZEROFILL本质上是大型机兼容模式。
Henk Poley

114

根据此处int(11)将占用4个字节的空间,即具有2^(31) = 2147483648最大值和-2147483648最小值的32位空间 。一位是符号。


1
您的示例有9个9。您能否确认您的示例正确无误?如果是这样,为什么有9个9时为什么说10?是位数加一加符号吗?
Homer6

5
否,如果为unsigned int,则最大数量为4294967295,即2 ^ 32。括号中的数字不影响存储类型。如果需要超过2 ^ 32,则需要转到bigint。
基兰·塔利

7
或者说(2 ^ 32)-1。
基兰·塔利

2
+基兰是对的。最大数字与答案中的数字不同。看到这里
daviewales

38

就像其他人所说的那样,该列可以存储的最小值/最大值以及以字节为单位的存储量仅由类型(而不是长度)定义。

这些答案中有很多都说该(11)零件仅影响显示宽度,这并不完全正确,但主要是。

的定义int(2)没有指定ZEROFILL将:

  • 仍然接受的值 100
  • 显示100 when输出的值(不是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进行了测试,对于其他实现可能有所不同。


5
“通知已经比zerofill2小得多的显示宽度,即使长度列如何INT1较大” ......埃姆,这只是因为列名“zerofill2”是9个字符长VS“INT1”是4
neokio

2
...是的,因此很明显,即使未启用填零功能,长度也不会影响显示宽度。否则,int1将会更宽,而宽度为10个字符。
Programster

2
一个有力的例子很好的解释。比被接受的答案更好的答案。谢谢@Programster。
科林

次要问题:正如neokio指出的那样,无法从该查询中观察到零填充的“ int(3)”的确切结果。将列名称缩写为“ zf2”,以使行为更清晰。具体来说,是对还是错(在给定的数据库版本上),即“(使用零填充)在显示值时,该列将始终具有该列可以采用的最大可能值的宽度,该宽度是整数的10位,”
ToolmakerSteve

1
为了澄清neokio的评论和我的未成年人的评论:句子“注意int1列的显示宽度比zerofill2小得多,即使长度更大。” 应该从答案中删除。这是标题字“ zerofill2”中字符数的结果-与测试显示宽度无关。最好给该列起一个较短的名称,例如“ zf2”。然后我们将得到一个表,其中“即使int2和zf2指定了较小的宽度(3),int1,int2和zf2的宽度也完全相同。”
制造商

32

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

(11)- int数据类型的此属性与列的大小无关。它只是整数数据类型的显示宽度。从11.1.4.5。数值类型属性

MySQL支持扩展,可以选择在整数类型的基本关键字之后的括号中指定整数数据类型的显示宽度。例如,INT(4)指定显示宽度为四位数的INT。


19

这方面的一个很好的解释可以发现,在这里

总结一下:在INT(N)的N个经常被允许列的最大尺寸混淆,因为在为varchar(N)的情况一样。

但这不是Integer数据类型的情况- 括号中的数字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手册


为什么行数在这里起作用?
老盖泽

@OldGeezer-同意,“行数”与大多数列无关。仅与自动递增主键(id)列相关。
制造商

10

尽管这个答案不太可能看到,但我认为以下澄清值得一说:

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


显然,显示宽度的细节旨在提供一些元数据,以显示在零填充数字中要显示多少个零。
如果该数字超过指定的显示宽度,则实际上并没有限制该查询返回的数字的长度。
要了解MySQL中整数数据类型实际上允许的长度/宽度,请参见列表和链接:(类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT);
综上所述,您可以预期显示宽度不会影响标准查询的结果,除非将这些列指定为ZEROFILL列,
或者
在将数据拉入应用程序且该应用程序正在收集数据的情况下显示宽度,用于其他类型的填充。

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


感谢您提供正确的答案。我正在从MySQL命令行尝试,但无法用small来n使任何数字丢失,所以...是的,这就是胡扯。它只对zerofill执行任何操作。
mpen

@mpen很高兴我能提供帮助,这与我正在尝试的事情有关,并认为我可以在此处提供更多有关其他人的有用信息。
MER


0

根据这本书

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



-9

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.