MySQL 中 int(1) 和 int(10) 会影响存储的长度吗

一、MySQL 中 int(1) 和 int(10)

MySQL数据库设计中,经常会遇到 int 类型的字段,并会习惯性的指定长度,比如: int(1)int(10),而一些新手可能会误解它们之间的关系,认为 int(10) 能够存储更多的数据。然而,实际上这两者之间的区别并非是存储容量上的不同,而是涉及到显示的问题。

首先,需要明确的是,int(1)int(10)在数据存储大小和范围上并没有任何区别。无论是int(1)还是int(10),在MySQL 中都是占4个字节,其范围从-2147483648 ~ 2147483647。这是因为int数据类型的存储大小是固定的,显示宽度并不会改变它们的实际存储能力。

比如有表结构如下:

CREATE TABLE `test` (
  `id` bigint(10) NOT NULL AUTO_INCREMENT,
  `num1` int(1) NOT NULL,
  `num2` int(10) NOT NULL,
  `num3` int(1) unsigned NOT NULL,
  `num4` int(10) unsigned NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

其中num1num2是允许负数,长度分别为110num3num4是允许非负数,长度同样分别为110

下面测试下num1num2写入最大值 2147483647 , num3num4 写入最大值 4294967295 会怎么样:

INSERT INTO test(num1,num2,num3,num4) VALUES (2147483647,2147483647,4294967295,4294967295 );

MySQL 中 int(1) 和 int(10) 会影响存储的长度吗_第1张图片

可以看到不管是 int(1) 还是 int(10) 都不影响写入数据的长度,下面对数据查询看是否影响展现:

MySQL 中 int(1) 和 int(10) 会影响存储的长度吗_第2张图片

可以看到展现上也没有影响,既然查看也没有区别,为什么前面说会涉及到显示的问题呢?

其实要搭配 zerofill 一起使用才有效。

比如定义下面表结构,对int类型指定 zerofill

CREATE TABLE `test1` (
  `id` bigint(10) NOT NULL AUTO_INCREMENT,
  `num1` int(1) zerofill NOT NULL,
  `num2` int(10) zerofill NOT NULL,
  `num3` int(1) unsigned zerofill NOT NULL,
  `num4` int(10) unsigned zerofill NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

下面写入一个比较小的数:

INSERT INTO test1(num1,num2,num3,num4) VALUES (123,123,123,123);

下面查看下展示效果:

MySQL 中 int(1) 和 int(10) 会影响存储的长度吗_第3张图片

可以看出 int(10) 的字段,如果长度不足 10 还会在前面补充 0

如果写入的内容比较大:

INSERT INTO test1(num1,num2,num3,num4) VALUES (2147483647,2147483647,4294967295,4294967295 );

再次查看,也丝毫不影响 int(1) 的展现:

MySQL 中 int(1) 和 int(10) 会影响存储的长度吗_第4张图片

总结:int后面的数字不能表示字段的长度,一般配合 zerofill,实现位数不足时补充 0 的效果。

你可能感兴趣的:(MySql,mysql,数据库)