mysql中int10跟int11的区别_int(10)和int(11)到底有什么
差别
项⽬开发时,需要先⾏设计数据库。不得不说,做程序开发这⼀⾏,经验实在太重要了,所以在设计数据库时,⼤多数⼈是凭经验去设定数据表各个字段的数据类型,⽐如主键id⼀般为int(10) unsigned primary key, 也有的是为int(11) unsigned primary key。这样问题就来了,为什么是选择int(10),有的选择int(11)?是有什么客观条件约束,抑或是“之前都是这么设计的“?int(10),int(11)也困扰了我好久,现在就来再次研究⼀下这其中的区别。
下载mysql为什么下载不了1. 先介绍下MySQL的int类型相关数据类型
(1). mysql数据库中对整型分为5个不同的⼩类型,分别是tinyint、smallint、mediumint、int和bigint,主要区别是数据库存储时使⽤⼏个字节,也就是说限定整数的范围,上述类型存储使⽤的字节为1、2、3、4和8。取值范围可以根据字节数来算出来。注意:它们都可以指定为⽆符号(⼤于等于零)的整数。类型字节数最⼩值(有符号)最⼤值(有符号)最⼩值(⽆符号)最⼤值(⽆符号)
tinyint1-1281270255
smallint2-3276832767065535
mediumint3-83886088388607016777215
int4-2147483648214748364704294967295
bigint8-92233720368547758089223372036854775807018446744073709551615
(2). 不同的数据类型的所占⽤的字节数是不同的,⽽⼀个字节包含8个byte(⼆进制位:0,1),所以也就是说tinyint由 1个字节数 * 8个byte = 8个⼆进制位组成,所以这8个⼆进制位能表⽰的数值的范围就是tinyint其所能存储的值的范围。
(3). 再⽐如说,int类型占4个字节,就是32个byte,
有符号时:-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647)
⽆符号时:0到2^32(4294967295)
(4). ⼆进制有符号位和⽆符号的差别在于:第⼀位表⽰正负, 第⼀位是0表⽰是正数,1表⽰是负数
⽆符号数: 1111 1111 值:255,
1* 2^7 + 1* 2^6 + 1* 2^5 + 1* 2^4 + 1* 2^3 + 1* 2^2 + 1* 2^1 + 1* 2^0 = 255
有符号数: 0111 1111 值:127 ,有符号位时,第⼀位不参与运算,只表⽰正负
1* 2^6 + 1* 2^5 + 1* 2^4 + 1* 2^3 + 1* 2^2 + 1* 2^1 + 1* 2^0 = 127
对于给定⼀个⼆进制数,⽆法判断是有符号还是⽆符号,有符号⽆符号是⼈为指定的,就如mysql中给可以明确指定字段类型是不是有符号⽆符号(unsigned),设定好,在根据有⽆符号位,做相应的逻辑处理。
2.重点来了,int(10),int(11)的区别在哪⼉呢?
上⾯已经说了,int类型占4个字节,32个byte,其能存储的数值范围已经是确定了的了
也就是说不管int(10),int(11),这个点类型已经定了是int,其存储范围是完完全全相同的
那int(10),int(11)括号⾥的⼜数字表⽰什么呢? 答:显⽰宽度,
那什么是显⽰宽度呢?请继续往下看
说再多,不如⼀个demo来的实在:
这⾥我⽤Navicat新建⼀个test1表,包含2个字段a tinyint(1), b tinyint(3),并且插⼊两条数据
然后,我们去查询这两条数据,我这⾥直接⽤的yii框架。⾥⾯的bin是mysql⾃带的函数,mysql的bin()函数能计算出这个值原始存储的⼆进制数。
查询结果如下:
⼀切正常,bin(a),bin(b)也是a,b的⼆进制数
然后修改下刚才的表结构,字段b还是tinyint(3),不过下⾯的填充零点上,既是tinyint(3) zerofill,然后在看下查询数据
上⾯的查询结果,已经能看出些不同了,在设定字段b填充零后,查出来的结果与之前就发⽣了变化,之前是‘1’变成了‘001’,之前是‘12’就变成了‘012’,这⾥我们就再说⼀下显⽰宽度这个概念,显⽰宽度只有和字段有zerofill这个属性结合起来才有意义。
这样说,字段b为tinyint(3),显⽰宽度为3位,如果没有zerofill,没什么影响,如果有了zerofill就有了变化。当存储的数据长度未达到字段设定的显⽰宽度(这⾥是3),mysql就会⾃动的在数据的左侧填充 0,已达到设定的显⽰宽度,所以说,原来的数值 1,长度只有1位,没有达到设定的显⽰宽度3,所以mysql⾃动将其填充为‘001’,但是其原始存储的⼆进制数据,没有任何变化,这只是‘应⽤层’的⼀个处理。这样说,应该能明⽩显⽰宽度了吧。
再说⼀下int(10)和int(11) 的问题,很多时候程序开发是为了解决极值(边界)问题,上⾯已经说到⽆符号位int最⼤存储值是 42 9496 7295(42亿多,数字是10位),⼀般情况下设计数据表时,主键id⼀般都会设为int,但是int最⼤为42亿多,我们不去怀疑有的很⼤型的项⽬,可能会达到这么⼤的数据量,但是更多的项⽬根本达不到这个数据量,可能连mediumint(1677 7215,1千6百多万)都达不到,但是“经验”告诉我们还是要设为 int
int(10)或int(11)显⽰宽度都已经能涵盖了int整个取值范围了,如果没有zerofill,就基本上没有任何差别了,如果有的话,就会⾃动填充到显⽰宽度,不过这样的话,int(10)只有10亿(10位数字)考上的不会发⽣填充0情况,int(11)所有的都会发⽣填充0 的情况(毕竟int最多也就10位数字)。不过呢,在数据库表的设计中⼀般不会给字段设定填充0的(起码,我没这样设计过)。
All of the above, int(10),int(11)只是⼀个显⽰宽度的问题,其所能存储的范围是⼀样的。如果字段没设定zerofill的话,没有任何差别!
That's it!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论