MySql int(1) 和 int(10) 有什么区别?

MySql int(1) 和 int(10) 有什么区别?

MySql 知识点总结之(int(1) 和 int(10) 有什么区别?)

先说结论

正常来说,没有区别。 后面带的数字,并不是长度的概念。 Int 类型就是占用4个字节(32位), Int(1), int(10) 都一样是4个字节/32位,数据范围也还是-2^31 ~ 2^31-1。

困惑

对于日常建表过程中,大家普遍认为在使用过程中int(10)通常表示数值长度的位数;包括我经常在也看到同事也一直使用int(10),感觉用了int(1),字段的上限就被限制,真实情况肯定不是这样。

数据说话

我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295,将近40亿,难道用了int(1),就不能达到这个最大值吗?

1
2
3
4
CREATE TABLE `user` (
`id` int(1) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

id字段为无符号的int(1),我来插入一个最大值看看。

1
2
mysql> INSERT INTO `user` (`id`) VALUES (4294967295);
Query OK, 1 row affected (0.00 sec)

可以看到成功了,说明int后面的数字,不影响int本身支持的大小,int(1)、int(2)…int(10)没什么区别。

官方解释

1
int(M): M indicates the maximum display width for integer types.

翻译过来就是,在 integer 数据类型中,M 表示最大显示宽度。

也就是说,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用4 bytes的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。

另外,int(M) 只有跟

1
zerofill

结合起来,才能更清楚的看到它的具体含义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> create table t(id int zerofill);
mysql> insert into t(id) values(10);
mysql> select * from t;
+------------+
| id |
+------------+
| 0000000010 |
+------------+
mysql> alter table t change column id int(4) zerofill;
mysql> select * from t;
+------+
| id |
+------+
| 0010 |
+------+
mysql> insert into t(id) values(1000000);
mysql> select * from t;
+---------+
| id |
+---------+
| 0010 |
| 1000000 |
+---------+

从上面的测试可以看出,“(M)”指定了 int 型数值显示的宽度,如果字段数据类型是 int(4),那么当显示数值 10 时,在左边要补上 “00”;当显示数值 100 是,在左边要补上“0”;当显示数值 1000000 时,已经超过了指定宽度“(4)”,因此按原样输出。

因此,在使用 MySQL 数据类型中的整数类型(tinyint、smallint、 mediumint、 int/integer、bigint)时,非特殊需求下,在数据类型后加个“(M)”,是没有任何意义的。

int(1)和int(11)在实际使用中,如果不使用 zerofill 是没有任何区别的,而且int型最大只能存储4294967295这个整数,也就是只有10位。

结论

综上所述,当我们需要用整形来存储一个字段类型的时候,应该尽量估算出该字段所需要的实际长度,比如tinyint可存储无符号最大值是255(1个字节长度,即2的8次方),smallint可存储无符号最大值是65535(2个字节长度,即2的16次方),mediumint可存储无符号最大值是16777215(3个字节长度,即2的24次方),而int型最大可存储4294967295(3个字节长度,即2的32次方)。


MySql int(1) 和 int(10) 有什么区别?
http://example.com/2024/03/29/MySqlSummary01/
作者
JunCCore
发布于
2024年3月30日
许可协议
BY-JUNCCORE