文章目录
探讨这个问题之前,我们先来回忆一下 MySQL 支持存储的数据类型有哪些 ?
MySQL 数据类型介绍
MySQL 支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。
数值类型
- 整数类型:tinyint、smallint、mediumint、int、bigint;
- 浮点小数类型:float 、double;
- 定点小数类型:decimal
日期/时间类型
year、time、date、datetime、timestamp
字符串类型
char、varchar、binary、varbinary、blob、text、enum、set 等
由于本篇文章重点讨论 int(integer)占用字节的问题,其所属整数型数据类型,所以下面从整型数据类型讲起
int(4)、int(8)、int(11) 分别占用几个字节 ?
MySQL 中的整数型数据类型:
类型名称 | 说明 | 存储需求 |
---|---|---|
tinyint | 很小的整数 | 1 个字节 |
smallint | 小的整数 | 2 个字节 |
mediumint | 中等大小的整数 | 3 个字节 |
int(integer) | 普通大小的整数 | 4 个字节 |
bigint | 大整数 | 8 个字节 |
从上表中可知,不同类型整数存储所需的字节数是不同的,占用字节数最小的是 tinyint 类型,占用字节最大的是 bigint 类型,相应的占用字节越多的类型所能表示的数值范围越大。根据占用字节数可以求出每一种数据类型的取值范围,例如 tinyint 需要 1 个字节(8 bits)来存储,那么 tinyint 无符号数的最大值为 2
8
,即 255。tinyint 有符号数的最大值是 2^7 – 1,即 127。其他类型的整数的取值范围计算方法相同,如下表所示:
不同整数类型的取值范围:
数据类型 | 有符号 | 无符号 |
---|---|---|
tinyint | -128~127 | 0~255 |
smallint | -32768~32767 | 0~65535 |
mediumint | -8388608~8388607 | 0~16777215 |
int(integer) | -2147483648~2147483647 | 0~4294967295 |
bigint | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 |
回归正题,int(4)、int(8)、int(11) 究竟占用几个字节呢 ?
答案已经在上面写明啦已经呼之欲出啦,他们都是 4 个字节。
我们以 int(11) 为例来说,11 代表该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。
再举个例子,假设声明一个 INT 类型的字段:
id int(4);
该声明指明,在 id 字段中的数据一般只显示 4 位数字的宽度。
注意:显示宽度和数据类型的取值范围是无关的。显示宽度只是指明 MySQL 最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。例如:假如向 id 字段插入一个数值 19999,当使用 select 查询该列值的时候,MySQL 显示的将是完整的带有 5 位数字的 19999,而不是 4 位数字的值。
再举个例子说明每种数据类型的默认显示宽度
创建表:
create table test (x tinyint, y smallint, z mediumint, m int, n bigint);
查看表结构:
可以看到,系统将添加不同的
默认显示宽度
。这些显示宽度能够保证显示每一种数据类型可以取到取值范围内的所有值。例如,tinyint 有符号数和无符号数的取值范围分别为 -128~127 和 0~255,由于负号占了一个数字位,因此 tinyint 默认的显示宽度为 4。同理,其他证书类型的默认显示宽度与其有符号数的最小值的宽度相同。
不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此,应该根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。
总结一下
显示宽度
只用于显示,并不能限制
取值范围和占用空间
,如:int(3) 会占用 4 个字节的存储空间,并且允许的最大值也不会是 999,而是 int 整型所允许的最大值。