mysql中int长度的意义

int的长度并不影响数据的存储精度,长度只和显示有关
int(M) 在integer 数据类型中,M 表示最大显示宽度。
在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。

如果int的值为10
int(10)显示结果为0000000010
int(3)显示结果为010
就是显示的长度不一样而已 都是占用四个字节的空间 

根据个人的实验并结合资料
1、长度跟可以使用的值的范围无关,值的范围仅跟类型对应的存储字节数和是否unsigned有关;

类型占用字节数有符号取值范围无符号取值范围
TINYINT1-128 ~ 1270 ~ 255
SMALLINT2-32768 ~ 327670 ~ 65535
MEDIUMINT3-8388608 ~ 83886070 ~ 16777215
INT4-2147483648 ~ 21474836470 ~ 4294967295
BIGINT8-2^63 ~ 2^63-10 ~ 2^64-1

2、长度指的是显示宽度,比如,指定3位int,那么id为3和id为300的值,在显示的时候怎么对齐呢?按照手册的说法,是默认用“空格”在左边填充。比如

CREATE TABLE `inttest` (
  `id` int(3) unsigned NOT NULL AUTO_INCREMENT,
  `value` varchar(2) NOT NULL,
  PRIMARY KEY (`id`)
) EN

现在分别插入id长度为2,3,4,5位的数据,执行查询以后得到显示如下:

复制代码
MariaDB [mytest]> select * from inttest;
+-------+-------+
| id    | value |
+-------+-------+
|    13 | a     |
|   111 | b     |
|  1000 | c     |
| 10000 | d     |
+-------+-------+
4 rows in set (0.00 sec)
复制代码

如果我们改成ZEROFILL,

CREATE TABLE `inttest` (
  `id` int(3) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `value` varchar(2) NOT NULL,
  PRIMARY KEY (`id`)
) EN

再次查询的结果如下:

复制代码
MariaDB [mytest]> select * from inttest;
+-------+-------+
| id    | value |
+-------+-------+
|   013 | a     |
|   111 | b     |
|  1000 | c     |
| 10000 | d     |
+-------+-------+
4 rows in set (0.00 sec)
复制代码

我们会发现,不足3位长度的值会被自动填充,而超过3位长度的值就不会被填充了。

 

以下是mysql官网对于设置宽度的解释:

“MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。“也就是说,int的长度并不影响数据的存储精度,长度只和显示有关

“当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度。

posted @ 2021-01-03 20:28  Pikatao  阅读(2002)  评论(0)    收藏  举报