mysql中的int(M)

本文解析了MySQL中INT类型的特性,特别是在定义INT(M)时M的实际意义,并通过示例展示了zerofill属性如何影响数值的显示格式。
在使用pdm设计表结构时,经常把int类型设置成int(11)。
于是问自己,int类型存储时不就是占4 个字节的存储空间吗?怎么mysql字段里的int还能设计成不同长度的?
测试了一把,发现其实这个长度跟存储没什么关系,存储时都是占4个字节的。
CREATE TABLE `test1` (
   `IDX` bigint(20) NOT NULL AUTO_INCREMENT,
   `ID` int(1) DEFAULT NULL,
   `ID2` int(3) DEFAULT NULL,
   `ID3` int(11) DEFAULT NULL,
   `ID4` int(11) DEFAULT NULL,
   `ID5` int(11) DEFAULT NULL,
   PRIMARY KEY (`IDX`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;

mysql中的int(M)

int(M)里的M表示最大显示宽度,当加上 zerofill才会表现出效果来。 比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)和int(10)不加 zerofill,则它们没有什么区别.M不是用来限制int个数的.int(M)的最大值和最小值与undesigned有关。借用网上的结论:
mysql> desc test;
+-------+--------------------------+------+-----+---------+----------------+
| Field | Type                               | Null | Key | Default | Extra               |
+-------+--------------------------+------+-----+---------+----------------+
| id      | int(3) unsigned zerofill | NO    | PRI | NULL      | auto_increment |
+-------+--------------------------+------+-----+---------+----------------+
1 row in set (0.01 sec)

mysql> select * from test ;

+------+

| id    |

+------+

|   001 |

|   010 |

| 1234 |

+------+

3 rows in set (0.00 sec)

不补零:

mysql> desc test;
+-------+--------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra               |
+-------+--------+------+-----+---------+----------------+
| id      | int(3) | NO    | PRI | NULL      | auto_increment |
+-------+--------+------+-----+---------+----------------+
1 row in set (0.01 sec)

mysql> select * from test ;
+------+
| id    |
+------+
|      1 |
|    10 |
| 1234 |
+------+
3 rows in set (0.00 sec)

### MySQL INT类型长度设置的规则和影响 在MySQL中,`INT`类型的长度设置主要指的是显示宽度,而不是存储空间或取值范围。以下是关于`INT`类型长度设置的作用与限制的详细说明: #### 1. 显示宽度的定义 `INT(M)`中的`M`表示显示宽度,它仅用于控制数据的显示格式,并不会影响实际存储的空间大小或取值范围[^1]。例如,`INT(5)`表示该字段的显示宽度为5个字符。如果插入的数据长度小于5,则显示时会补齐空格;如果插入的数据长度大于5,则仍然完整显示所有字符。 #### 2. 存储空间与取值范围 无论显示宽度如何设置,`INT`类型的存储空间始终固定为4字节,其取值范围也保持不变: - 有符号:`-2^31`到`2^31 - 1`(即`-2147483648`到`2147483647`)。 - 无符号:`0`到`2^32 - 1`(即`0`到`4294967295`)[^2]。 即使将`INT`类型的显示宽度设置为较小的值(如`INT(3)`),其存储空间仍然是4字节,最大值也不会被限制为999。 #### 3. 填充零(ZEROFILL)的影响 当为`INT`类型字段添加`ZEROFILL`属性时,显示宽度会变得有意义。此时,MySQL会在数值前自动填充零,直到达到指定的显示宽度。例如: ```sql CREATE TABLE test ( id INT(5) ZEROFILL NOT NULL ); ``` 如果插入值`123`,则显示为`00123`[^4]。 #### 4. 临时表生成时的影响 在某些复杂的联结操作中,MySQL可能会生成临时表。在这种情况下,MySQL会假设所有值都能适应原始列的宽度。如果显示宽度设置过小,可能会导致数据截断或其他问题。因此,在设计表结构时,建议根据实际需求合理设置显示宽度[^3]。 #### 5. 不同整型类型的对比 MySQL提供了多种整型类型,包括`TINYINT`、`SMALLINT`、`MEDIUMINT`、`INT`和`BIGINT`。这些类型的主要区别在于存储空间和取值范围。例如: - `TINYINT`:1字节,范围为`-128`到`127`(有符号)或`0`到`255`(无符号)。 - `SMALLINT`:2字节,范围为`-32768`到`32767`(有符号)或`0`到`65535`(无符号)。 - `INT`:4字节,范围为`-2147483648`到`2147483647`(有符号)或`0`到`4294967295`(无符号)。 - `BIGINT`:8字节,范围为`-9223372036854775808`到`9223372036854775807`(有符号)或`0`到`18446744073709551615`(无符号)[^2]。 ### 示例代码 以下是一个创建表并测试`INT`类型显示宽度的示例: ```sql CREATE TABLE test_int ( id INT(5) NOT NULL, number INT(5) ZEROFILL NOT NULL ); INSERT INTO test_int (id, number) VALUES (123, 123); SELECT * FROM test_int; -- 结果: -- id: 123 -- number: 00123 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值