本篇文档重点
这5种整型的占用空间是固定的,均与其后设置的 n 无关,例如设置字段类型为 int ,则无论 n 设置什么,它占用的空间就是4个字节。
以 int 为例,无论 int(n) 中的 n 设置什么值,无论插入的这个值或大或小,只要在取值范围内,那这个字段就是占用4个字节。n只代表最小显示位宽。
字符和字节的区别
因为mysql中存储的不一定是英文字符,因此一个字符占的空间不一定是一个字节。
字符串类型
- CHAR(n) 和 VARCHAR(n) 两者中的 n 含义均为该字段最大可容纳的字符数。
- 对于 CHAR(4) 表示固定容纳4个字符,当少于4个字符时,会使用空格填充空缺的部分,使其达到4个字符。如果超过4个字符,会自动截断超出部分。
- VARCHAR (n)类型对于未达到 n 字符的情况不会补空。
VARCHAR 类型字符串的占用空间实际上包含2部分,一是存储数据本身占用的空间,二是描述数据的元数据
占用的空间,例如 VARCHAR 类型会使用1个字节记录存入数据实际的字符数。
整数类型
- 常用的整数数据类型有 tinyint ,smallint ,mediumint , int ,bigint 共计5种
- 在声明列时,后面也可以跟上 n ,例如 int(n) 。实际上这里的 n 非常鸡肋,几乎没有任何使用场景。它的含义是“显示位宽”,这个 n 无论填任何数,不影响存储环节,仅影响在检索时的输出格式,而且在非常严格的情况下才成立。从显示位宽的角度理解,n代表最小显示位宽。
- 占用空间
这5种整型的占用空间是固定的,均与其后设置的 n 无关,例如设置字段类型为 int ,则无论 n 设置什么,它占用的空间就是4个字节。
tinyint :1个字节,
smallint :2个字节,
mediumint :3个字节,
int :4个字节,
bigint :8个字节。
浮点型
- FLOAT 类型固定占用4个字节, DOUBLE 类型固定占用8个字节,逻辑和上述的整型类似,不再赘述。即:指定的总位宽和小数宽度只影响显示位宽,不影响存储空间。
- DECIMAL 类型,它的定义方式是 DECIMAL(M,D) ,其中 M 表示最大位数,D 表示小数点右侧的位数。这里的“位”不是二进制的比特位,而是指十进制的数字的位数。
例如我们定义 DECIMAL(5,2) ,则表示最大位数为5位,小数点后2位,因此小数点前还剩下3位,于是取值范
围为 -999.99至999.99 。
- 占用空间:DECIMAL(M,D) 的存储方式和其他数字类型都完全不同,它是以字符串形式进行存储的。
- 1个数字字符占用1个字节,因此定义为 DECIMAL(M,D) 占用 M 个字节。(同上所述,M个字节为数据本身的占用空间,另外描述该数据的元数据还固定占用2个字节的空间)。
- DECIMAL 类型在存储时有补0操作。小数点前不足,向更高位补0,小数点后不足,向更低位补0。