一直被误导
从去年开始用Mysql,然后经常看到建表类似语句
当时不明所以,以为是数据类型对应的存储最大长度,比如tinyint(1),就只能存储0,1,...9以内数字,11就不行;
所以人云亦云,在自己处理的时候,也这样设置了长度。
突然,有一天,想查一下(心血来潮),发现一直被误导了,被自己误导了。
真相
看一下mysql官网的数据类型定义
以tinyint为例,存储值在-128~127之间,非负时0-255。创建一个表
CREATE TABLE `test` (
`id1` tinyint(2) DEFAULT NULL,
`id2` int(4) unsigned DEFAULT NULL
) ENGINE=InnoDB;
现在插入2条数据
-- 十位数字,猜测能插入
INSERT INTO test VALUES(11,44);
-- 十位数字,猜测不能插入
INSERT INTO test VALUES(111,444);
结果,,都成功了,说明以前的猜测是错误的:tinyint(M)的M并不是代表存储的最大长度
为此,我们再次验证,将id1改成tinyint(1)
ALTER TABLE test MODIFY `id1` TINYINT(1);
再次插入
发现插入127成功,128失败,所以得出结论:TYPE(M)的M与存储并没有关系
那这个到底有什么用呢?
zerofill
wtf?TYPE(M)中的M在什么情况下用呢?zerofill:如果值长度不够,在前面补0表示。
还是以上面的表为例,id1改回为tinyint(2),插入新数据
ALTER TABLE test MODIFY `id1` TINYINT(2) ZEROFILL;
INSERT INTO test VALUES(1,4);
再查一下表数据:
发现并没有什么变化,so?别急,刚才是在window下,现在linux下查询试试
有了!可以再扩大tinyint(3),tinyint(4),可以看到相应的结果。