MySQL 字段类型

MySQL 字段类型

MySQL 字段类型可以简单分为三大类:

  • 数值类型
    • 整型:TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT
    • 浮点型:FLOAT、DOUBLE
    • 定点型:DECIMAL
  • 字符串类型
    • 常用:CHAR 和 VARCHAR
    • TEXT类:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
    • BLOB类:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB
  • 日期时间类型:YEAR、TIME、DATE、DATETIME 和 TIMESTAMP 等。

整型相关问题

整型如何存储Boolean类型:

MySQL 中没有专门的布尔类型,而是用 TINYINT(1) 类型来表示布尔值。TINYINT(1) 类型可以存储 0 或 1,分别对应 false 或 true。

整型如何存储IP地址:

可以将 IP 地址转换成整形数据存储,性能更好,占用空间也更小。

MySQL 提供了两个方法来处理 ip 地址

  • INET_ATON():把 ip 转为无符号整型 (4-8 位)
  • INET_NTOA() :把整型的 ip 转为地址

插入数据前,先用 INET_ATON() 把 ip 地址转为整型,显示数据时,使用 INET_NTOA() 把整型的 ip 地址转为地址显示即可。

整型-UNSIGNED属性

MySQL 中可以使用可选的 UNSIGNED 属性表示整数类型不允许负值。对于从 0 开始递增的 ID 列,使用 UNSIGNED 属性可以拥有更大的上限范围。

小数型相关问题

定点型-浮点型-区别

  • DECIMAL 是定点数,DECIMAL 可以存储精确的小数值。例如与货币相关的数据,避免浮点数带来的精度损失。在 Java 中,MySQL 的 DECIMAL 类型对应的是 Java 类 java.math.BigDecimal。
  • FLOAT/DOUBLE 是浮点数,FLOAT/DOUBLE 只能存储近似的小数值。

字符串相关问题

字符串-NULL-”-区别

字符串-char-varchar-区别

  • CHAR(0-255 字节)是定长字符串,VARCHAR(0-65,535 字节) 是变长字符串
  • CHAR适合存储长度较短或者长度都差不多的字符串,VARCHAR适合存储长度不确定或者差异较大的字符串
  • CHAR在存储时会在结尾填充空格以达到指定的长度,检索时会丢失末尾的空格信息。VARCHAR 在存储时需要使用 1 或 2 个额外字节记录字符串的长度。
  • CHAR后续修改不会造成页分裂的问题,使用varchar可能会产生内存碎片,update可能会导致页分裂问题。 CHAR(M) 和 VARCHAR(M) 的 M 都代表能够保存的字符数的最大值,无论是字母、数字、中文还是表情,每个都只占用一个字符

字符串-varchar(100)-varchar(10)-区别

VARCHAR(100)表示最多能存储 100 个字符,VARCHAR(10)则是10个。但二者存储相同的字符串,所占用磁盘的存储空间其实是一样的,VARCHAR(100) 会消耗更多的内存。

TEXT-BLOB-不推荐使用原因

日期时间类型

日期时间-DATETIME-TIMESTAMP-区别

  • DATETIME 类型没有时区信息,占用8 个字节,DATETIME:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
  • TIMESTAMP 和时区有关,占用4 个字节,Timestamp:1970-01-01 00:00:01 ~ 2037-12-31 23:59:59

文件类型

MySQL字段优化

参考

  • MySQL函数
  • 《高性能 MySQL(第三版)》的第四章,详细介绍 MySQL 字段类型优化。