# 数据类型

在数据表中定义字段时,需要指定其数据类型。

# 整型

tinyint       # 占 1 字节的存储空间
smallint      # 2 字节
mediumint     # 3 字节
int           # 4 字节
bigint        # 8 字节
  • 上述数据类型默认为带符号的(signed),也可以声明为无符号的(unsigned)。
    • 比如 tinyint 的取值范围为 -128 ~ 127 ,而 tinyint unsigned 的取值范围为 0 ~ 255 。
  • 例:
    CREATE TABLE tb1(
      id    int,          -- 定义一个字段,名为 id ,数据类型为 int
      id2   int unsigned, -- 设置为无符号的
      id3   int(5),       -- 设置总位数为 5 ,如果不足,则自动在左侧添加 0 补齐。比如写入 18 时,存储为 00018
    };
    

# 浮点型

float         # 4 字节
double        # 8 字节
decimal(m,d)  # 小数。m 是总位数,d 是小数位数

# 字符串型

char(n)
varchar(n)

tinytext      # 最大容量为 2^8 -1 = 255   字符,使用开头的 1 字节存储值的长度
text          # 最大容量为 2^16-1 = 65535 字符
mediumtext    # 最大容量为 2^24-1 ≈ 16 MB 字符
longtext      # 最大容量为 2^32-1 ≈ 4 GB  字符
  • char(n)

    • n 的取值范围为 0~255 ,默认为 1 。
      • 如果写入的字符数不足 n ,则自动在末尾加上空格填充,因此固定占用 n 字符的存储空间。
    • 适合存储固定长度的字符串,但可能浪费存储空间。索引速度快。
    • 检索 char 类型的值时,会自动删掉末尾的空格。检索 varchar、text 等类型的值时不会删掉。
    • char(0) 字段只占用 1 bit 的存储空间,只能写入一个 Null 或空字符串作为值。
  • varchar(n)

    • n 的取值范围为 0~65535 。
      • 当 n<256 时,使用开头的 1 字节存储值的长度,因此最多允许写入 n-1 个字符。
      • 当 n>=256 时,使用开头的 2 字节存储值的长度,因此最多允许写入 n-2 个字符。
    • 适合存储长度可变的字符串,不会浪费存储空间。索引速度慢。
    • 如果给 char、varchar 字段写入的值超过最大长度,则会被自动截断。
      • 但如果启用了 STRICT sql_mode ,则不会截断,而是拒绝写入并报错。此时应该先检查写入的值是否过长。
    • 如果创建 varchar、varbinary 字段时,长度超过 65535 ,则会分别自动转换成 text、blob 类型。
      • 但如果启用了 STRICT sql_mode ,则会报错。
  • text

    • 创建 char、varchar 字段时需要声明其长度,而创建 text 字段时不需要。
    • 适合存储长度可变且很长的字符串。
  • MySQL 表中,每行的所有字段累计最多占用 65535 字节,否则不能创建表。

    • 这主要限制了 char、varchar 字段的数量和大小,因为 text、blob 字段是分开存储在其它位置,在行内只占用 9~12 字节的存储空间。

# 二进制型

binary(n)
varbinary(n)

tinyblob
blob          # 最大容量为 2^16-1 = 65535 字节
mediumblob
longblob
  • binary、varbinary、blob 的用法、容量与 char、varchar、text 类似。
    • 以字符串格式存储的字段,是以字符为单位计算长度。以二进制格式存储的字段,是以字节为单位计算长度。
    • 例如,在 char(3) 字段中写入 3 个 utf8 字符,则最多占用 3*3 字节的存储空间,
  • 如果创建 char、varchar、text 字段时声明了 character set binary ,则会分别自动转换成 binary、varbinary、blob 类型。

# 时间类型

date          # 3 字节,格式为 `YYYY-MM-DD`
time          # 3 字节,格式为 `HH:MM:SS`
datetime      # 8 字节,由 date 和 time 组合而成,格式为 `YYYY-MM-DD HH:MM:SS`
timestamp     # 4 字节,自动存储修改的时间戳

# 其它类型

json          # MySQL 5.7 加入的数据类型