mysql中int(1)和int(10)有哪些区别

困惑

最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1)。在看到我的SQL工单后,领导说道:恐怕你所设定的int(1)可能不够使用,接着开始进行解释。

我并不是第一次遇到这种问题,有些遇到过这种问题的人已经从事这个工作超过5年。包括我经常在也看到同事也一直使用int(10),感觉用了int(1),字段的上限就被限制,真实情况肯定不是这样。

数据说话

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

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

MySQL中int(1)和int(10)的区别是什么

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

mysql>
INSERT INTO `user` (`id`) VALUES (4294967295);

Query OK, 1 row affected (0.00 sec)

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

零填充

一般int后面的数字,配合zerofill一起使用才有效。先看个例子:

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

注意int(4)后面加了个zerofill,我们先来插入4条数据。

mysql>
INSERT INTO `user` (`id`) VALUES (1),(10),(100),(1000);

Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0

分别插入1、10、100、1000 4条数据,然后我们来查询下:

mysql>
select * from user;

+------+
| id |
+------+
| 0001 |
| 0010 |
| 0100 |
| 1000 |
+------+
4 rows in set (0.00 sec)

通过数据可以发现 int(4) + zerofill实现了不足4位补0的现象,单单int(4)是没有用的。而且对于0001这种,底层存储的还是1,只是在展示的会补0。



当我们在MySQL数据库中定义整数类型时,通常会使用int类型。在int类型中,有很多不同的大小可以选择,如int(1)和int(10)。那么这两种类型有什么区别呢?本文将探讨这个问题,并帮助您根据需求选择适当的类型。
int(1)和int(10)的定义
在MySQL中,int(1)被定义为一个有符号的8位整数,取值范围为-128到127。而int(10)被定义为一个有符号的32位整数,取值范围为-2147483648到2147483647。它们之间的区别很明显,前者范围更小,后者范围更大。
区别一:存储空间
由于其取值范围的不同,int(1)与int(10)所需的存储空间也不同。尽管它们都是整数类型,但它们所使用的存储空间也不同。在MySQL中,一个int类型的列始终使用4个字节的存储空间。因此,int(1)与int(10)的存储空间与其定义无关。
区别二:用途
虽然int(1)和int(10)的范围不同,但它们都可以用于存储整数值。然而,它们在不同的业务场景中具有不同的用途。int(1)经常用于存储逻辑值,通常是0或1。例如,在购物车中,我们可以使用int(1)来指示商品是否已添加到购物车中,1表示已添加,0表示未添加。而int(10)则适用于存储较大的整数值,例如订单号、用户ID等。
区别三:查询效率
在查询效率方面,int(1)和int(10)之间存在一定的差异。如果在一个int(1)的列上创建了索引,那么它会比在一个int(10)的列上创建索引更有效率。因为一个单独的字节要比一个整数更小,因此查询要快得多。此外,使用较小的数据类型可以减少I/O操作并提高查询性能。
结论
虽然int(1)和int(10)都是整数类型,但它们在不同的业务场景中具有不同的用途。如果您需要存储逻辑值,则应选择int(1)。如果您需要存储较大的整数值,则应选择int(10)。另外,如果您在整数列上创建索引,则应优先选择int(1),以获得更好的查询性能。选择正确的整数类型可以帮助您提高系统的效率和性能。
在MySQL数据库中,整数类型是最基本的数据类型之一,它们在不同的业务场景中有不同的使用方式和性能。通过了解int(1)和int(10)之间的区别,您将能够更好地管理您的数据库,从而提高系统的效率和性能。