MySQL基础:int(1) 和 int(10) 有什么区别

在数据库设计与维护的日常工作中,一个常见但易引发误解的话题围绕着整型字段(如INT)的显示宽度(如int(1)、int(10))的实际作用。这一现象不仅在新手中频繁出现,就连经验丰富的开发者也时常陷入误区。最近,就有这样一个实例:当提议在表中添加一个可能承载大量用户ID的user_id字段,并使用了 ALTER TABLE xxx ADD user_id INT(1);这样的SQL语句时引发了很多开发同学的关注与纠正。同学们的疑问——“这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;

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。

总结

int后面的数字不能表示字段的长度,int(num)一般加上 zerofill 才有效果。zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 … 999这种,如果mysql没有零填充的功能,但是你又要格式化输出等长的数字编号时,那么只能自己处理了。

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值