今天偶然发现同事在写sql建表的时候把int类型括号后面的数字写成了1,但是我发现数据库里面的值已经远远超过了1位所能表示的范围,所以括号里面的数字肯定不是表示长度了(印象中早期的navivat建表的时候,int类型如果默认不指定长度,默认好像是10,我现在用的是naviavat16,没有出现默认为10的情况),下面就总结一下int(1)和int(10)到底有啥区别:
我们先来看第一个测试表:
CREATE TABLE `int_test` (`id` int NOT NULL AUTO_INCREMENT,`age` int(1) NOT NULL,`salary` int(10) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='int长度测试';
然后执行Insert添加数据:
INSERT INTO `int_test`(age,salary) VALUES(1,10),(10,100),(10,1000000000);
再执行查询语句:
由此可见:int(1)和int(10)实际上没什么区别,不影响查询和计算结果,也就是说底层在存储的时候实际上还是4个字节,范围是负21亿多到正21亿多
再看第二个测试表:注意建表语句中多了ZEROFILL,翻译过来是0填充的意思
CREATE TABLE `int_test_1` (`id` int NOT NULL AUTO_INCREMENT,`age` int(1) ZEROFILL NOT NULL,`salary` int(10) ZEROFILL NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='int长度测试';
仍然insert同样的数据:
INSERT INTO `int_test_1`(age,salary) VALUES(1,10),(10,100),(10,1000000000);
再执行查询:
换navicat执行查询:
由此可以得出以下结论:
1、对于int类型括号里面的数字没有实际意义,在底层存储的时候占用的还是4个字节,特别要注意的是这个数字并不表示长度
2、如果在括号里面写了数值,并且建表语句用了zerofill,也没有什么影响,只是不同的客户端在处理的时候显示不一样,仅此而已
3、不论有没有在括号里面指定数字,以及不论有没有zerofill,都不会影响计算结果