mysql中int类型的宽度M解析
一直以来在MYSQL建表的时候都有一个困惑,那就是关于int类型。int(M)这个M代表什么?
比如我定义一个文章的主键news_id为int(8)为什么要定义为8?如果我存储一个位数为10的数3445667788,发现实际也是可以存储的。于是查看mysql的手册,发现有这样一段话:M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关。
显示宽度,我们可以理解为所存储数值的位数。比如我设置news_id为int(8),是告诉mysql我要存储的数值的最大位数是个8位数,但是如果存储的超过8位数,只要在int类型允许的范围内(signed类型-21474836482147483647,unsigned类型04294967295)也是可以存储的。比如:
从上面两个图可以看出,我存储了一个超过8位数的int类型数据,还是能够正常显示的。那么问题又来了,这个M既然只要我能保证在所属范围之内,我是不是可以随意去定义了,当然不是的。首先设置M肯定要跟实际的业务数据相关,多设置浪费存储空间。另外如果你设置了填充0,zerofill的话就可以看出一些端倪。
我们把news_id的宽度设置为3,然后再查看下看看:
我们看到值为1的左端填充了0,原来默认为0的变成了000.所以如果M设置为某个值,并且设置了zerofill的话,当存储的长度小于M的话,会自动填充0.所以有时项目里确实需要存储类似于001,002...的值时,这个M的设置要符合业务需求。对于tinyint,mediumint,bigint等一样的理解。
相比较来说,char(n)和varchar(n)类型的这个n代表实际的存储长度,超过了会被mysql截掉。还是有所区别的。