某天朋友问我“为什么我在MySQL数据库中,建表的SQL语句和查询建表后的建表语句不一样啊,int类型的自动变为int(11)了”。我只能回答,“就是酱紫的啊,MySQL就这么设计的”。可是我不能回答为什么会是这样,为什么会是11不是12呢。突然发现自己好low啊,这个问题都回答不了。查了相关资料和做了如下测试后算是彻底搞明白了这个问题。
首先,使用如下sql语句建表:
CREATE TABLE test(id int);
然后使用mysql命令查看建表语句
SHOW CREATE TABLE test
结果显示如下:
这里int自动的变成了int(11)。为什么会这样,还得从int(m)中的m指的是什么来回答这个问题。
MySQL中int类型的取值范围是固定的,带符号范围:-2 147 483 648~2 147 483 647 无符号范围:0~4 294 967 295 。int(m)中的m值,只是决定在查询时显示中的最小长度,对于取值范围没有半毛钱的关系。比如将id字段的属性改为int(5) zerofill ,这个属性的意思是,定义一个int类型的字段,字段值如果小于5位,高位用0填充。验证如下,
通过结果可以看到,如果不足5位,在前面用0填充显示,如果超出5位数,对长度也没有任何影响。知道了(m)的作用,那么再来说说为什么MySQL会默认给11位,数一数int取值范围的最大值和带符号范围的最小值发现刚好是10位数,因为还要给显示符号留一位,所以默认就是int(11)喽。
m的取值范围是多少?在int类型的字段上赋超过范围的值会报什么样的错误?大家都可以去尝试一下。
如果读到这里,认为我想表达的是“实践出真理”吗?不不不,我想说,实践固然重要,但是阅读官方文档更重要。官方的才是最正经的。对于本文的问题,官网文档中给出了明确的说明。