相信很多用了mysql的人都很迷茫
1.对于整形的字段用了unsigned有什么区别?
2.tinyint(1) 和 tinyint(7) 究竟有什么区别?
下面来简单分析一下:
1、对于每种整形来说,都分无符号(unsigned)和有符号(signed)两种类型,如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的数据,比如16位系统中一个int能存储的数据的范围为–32768 ~ 32767(16位2进制的最高位作为符号位‘1’为负‘0’为正),而unsigned能存储的数据范围则是0~65535(这个最高位不用做符号位,所以是2的16次方,一共65536)。
由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。同时在相同位数的情况下,所能表达的整数范围变大。
下面提供一下MYSQL中各种类型的整形的存储范围
2、说到tinyint(1)和 tinyint(7)的区别,就不能不提mysql的整形的一个特性,zerofill,即是否在位数不足的时候,左补0。
明白这个定义之后,其实就是非常清楚了,1也好,7也好,只是和zerofill结合起来使用,用来标识存储的值在不满足多少位的情况下左补0
看例子 :
先建一张测试表test1
CREATE TABLE IF NOT EXISTS `test1` (
`t1` int(5) unsigned NOT NULL,
`t2` int(11) unsigned zerofill NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_unicode_ci;
INSERT INTO `test1` (`t1`, `t2`) VALUES
(111, 111111),
(111111,1111);看一下最终的数据显示:
真相都在图中了。