参考文档

本篇文档重点

这5种整型的占用空间是固定的,均与其后设置的 n 无关,例如设置字段类型为 int ,则无论 n 设置什么,它占用的空间就是4个字节
以 int 为例,无论 int(n) 中的 n 设置什么值,无论插入的这个值或大或小,只要在取值范围内,那这个字段就是占用4个字节n只代表最小显示位宽。

字符和字节的区别

因为mysql中存储的不一定是英文字符,因此一个字符占的空间不一定是一个字节。

字符串类型

  1. CHAR(n) 和 VARCHAR(n) 两者中的 n 含义均为该字段最大可容纳的字符数
  2. 对于 CHAR(4) 表示固定容纳4个字符,当少于4个字符时,会使用空格填充空缺的部分,使其达到4个字符。如果超过4个字符,会自动截断超出部分。
  3. VARCHAR (n)类型对于未达到 n 字符的情况不会补空。

VARCHAR 类型字符串的占用空间实际上包含2部分,一是存储数据本身占用的空间,二是描述数据的元数据
占用的空间,例如 VARCHAR 类型会使用1个字节记录存入数据实际的字符数。

整数类型

  1. 常用的整数数据类型有 tinyint ,smallint ,mediumint , int ,bigint 共计5种
  2. 在声明列时,后面也可以跟上 n ,例如 int(n) 。实际上这里的 n 非常鸡肋,几乎没有任何使用场景。它的含义是“显示位宽”,这个 n 无论填任何数,不影响存储环节,仅影响在检索时的输出格式,而且在非常严格的情况下才成立。从显示位宽的角度理解,n代表最小显示位宽。
  3. 占用空间

这5种整型的占用空间是固定的,均与其后设置的 n 无关,例如设置字段类型为 int ,则无论 n 设置什么,它占用的空间就是4个字节

  1. tinyint 1个字节,
  2. smallint 2个字节,
  3. mediumint 3个字节,
  4. int 4个字节,
  5. bigint 8个字节。

浮点型

  1. FLOAT 类型固定占用4个字节, DOUBLE 类型固定占用8个字节,逻辑和上述的整型类似,不再赘述。即:指定的总位宽和小数宽度只影响显示位宽,不影响存储空间。
  2. DECIMAL 类型,它的定义方式是 DECIMAL(M,D) ,其中 M 表示最大位数,D 表示小数点右侧的位数。这里的“位”不是二进制的比特位,而是指十进制的数字的位数。

例如我们定义 DECIMAL(5,2) ,则表示最大位数为5位,小数点后2位,因此小数点前还剩下3位,于是取值范
围为 -999.99至999.99 。

  1. 占用空间:DECIMAL(M,D) 的存储方式和其他数字类型都完全不同,它是以字符串形式进行存储的。
    • 1个数字字符占用1个字节,因此定义为 DECIMAL(M,D) 占用 M 个字节。(同上所述,M个字节为数据本身的占用空间,另外描述该数据的元数据还固定占用2个字节的空间)。
    • DECIMAL 类型在存储时有补0操作。小数点前不足,向更高位补0,小数点后不足,向更低位补0。