关于mysql中int(1)中int后⾯的数字(转发)
详解mysql int类型的长度值问题
作者:追逐_something
我的朋友海滨问我mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最⼤宽度吗? 为什么我设置成int(1), 也⼀样能存
10,100,1000呢.
当时我虽然知道int(1),这个长度1并不代表允许存储的宽度,但却没有⼀个合理的解释. 或者说对这个长度也没有真正的研究过到底代表什么, 平时都⽤int(11), 也不知道为什么要11位. 所以我在⽹上查阅了⼀些资料, 也仔细的看了mysql⼿册关于int data type的说法.
以下是每个整数类型的存储和范围(来⾃mysql⼿册)
类型字节最⼩值最⼤值
(带符号的/⽆符号的)(带符号的/⽆符号的)
TINYINT1-128127字符串长度1是什么意思
0255
SMALLINT2-3276832767
065535
MEDIUMINT3-83886088388607
016777215
INT4-21474836482147483647
0429*******
BIGINT8-92233720368547758089223372036854775807
018446744073709551615
表格⼀共有四列分别表式:字段类型, 占⽤字节数, 允许存储的最⼩值, 允许存储的最⼤值.
我们拿int类型为例:
int类型, 占⽤字节数为4byte, 学过计算机原理的同学应该知道, 字节(byte)并⾮是计算机存储的最⼩单位, 还有⽐字节(byte)更⼩的单位, 也就是位(bit),⼀个位就代表⼀个0或1; 8个位组成⼀个字节; ⼀般字节⽤⼤写B来表⽰byte, 位⽤⼩写b来表⽰bit.
计算机存储单位的换算:
1B=8b
1KB=1024B
1MB=1024KB
那么根据int类型允许存储的字节数是4个字节, 我们就能换算出int UNSIGNED(⽆符号)类型的能存储的最⼩值为0, 最⼤值为4294967295(即
4B=32b, 最⼤值即为32个1组成);
接下来我们再说说我们建表时的字段长度到底是怎么⼀回事.
CREATE TABLE `test` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`number` INT( 5 ) NOT NULL
) ENGINE = MYISAM ;
以test表的number字段为例, ⼤家看到我建的是int(5)
mysql⼿册中这个长度/值⽤"M"来表⽰的. 细⼼的朋友应该有注意到过mysql⼿册上有这么⼀句话: M指⽰最⼤显⽰宽度。最⼤有效显⽰宽度是255。显⽰宽度与存储⼤⼩或类型包含的值的范围⽆关;
这句话看上去不太容易理解, 因为这⾥有个关键词容易让我们混淆, "最⼤显⽰宽度"我们第⼀反应是该字段的值最⼤能允许存放的值的宽度. 以为我们建了int(1),就不能存放数据10了, 其实不是这个意思.
【重点:】
这个M=5我们可以简单的理解成为, 我们建⽴这个长度是为了告诉MYSQL我们这个字段的存储的数据的
宽度为5位数, 当然如果你不是5位数(只要在该类型的存储范围之内)MYSQL也能正常存储, 这也就能解释以上标红的话.
我们把这个字段的"属性"修改为UNSIGNED ZEROFILL看⼀下效果.
我们看到现在我的number字段, 长度(M)=5, 属性=UNSIGNED ZEROFILL(⽆符号,⽤0来填充位数), 设置这个属性后我往表时插⼊数据,系统会⾃动把number字段M不够5位的在左侧⽤0来填充; 效果如下
⼿册上还有这么⼀句话"当为某些复杂的联结(join)⽣成临时表时,你可能会遇到问题,因为在这种情况下,mysql 信任地认为所有的值均适合原始的列宽度". 这也让我不禁感叹这个宽度到底如何设置⽐较合适?
但有⼀点看完该⽂档你应该清楚的知道, 长度M与你存放的数值型的数的⼤⼩⽆关.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论