mysql int(11)的理解

之前一直认为int(m),就可以存储m位的长度的数据,直到有一次我发现int(5)也可以存储12939875891,我才想到去认真看下这个字符类型的意义。

如下参考官方的文档,我们以int举例,其他类型相似。

不论是int(m)m的值是多少,都占4Byte,那么m指定多少到底干嘛用的呢?举例往下看。

第一个例子,m等于5,按照之前的逻辑就只能插入5个数字,多了不行,实际不是的,只要插入不超过10位数字都是可以的。

mysql> show create table test2;
+-------+----------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------+
| test2 | CREATE TABLE `test2` (
`id` int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------+

mysql> insert into test2 values (1293987589);
Query OK, 1 row affected (0.16 sec)

第二个例子:int(20),按照之前的思维可以存储20位的数字,其实不然,int定义的再大,还是会受int最大值的影响,只能存储10位以内的数据

mysql> show create table test2;
+-------+----------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------+
| test2 | CREATE TABLE `test2` (
`id` int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------+

mysql> insert into test3 values (1111111111111111111);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

第三个例子,int(m)到底什么作用?

mysql> show create table test4;
+-------+-------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------+
| test4 | CREATE TABLE `test4` (
`id` int(20) unsigned zerofill NOT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------+

ps:unsigned zerofill NOT NULL 当不满足int(m)的指定宽度就用0来进行填充

mysql> insert into test4 values (1111111111);
Query OK, 1 row affected (0.01 sec)

mysql> select * from test4;
+----------------------+
| id |
+----------------------+
| 00000000001111111111 |
+----------------------+

我们会发现int(20),除了10位要求,其他的可以用0来进行填充

以上总结int(m)的用法:

1.不论m为多少,都是固定占用8Byte。

2.不论m为多少,都要受官方存储

原文地址:https://www.cnblogs.com/liuxiuxiu/p/15557172.html