文章目录

  1. 1. 整数类型
  2. 2. 实数类型
  3. 3. 字符串类型
  4. 4. 枚举类型
  5. 5. 时间类型

要了解 MySQL 数据库,首先必须要了解 MySQL 支持的数据类型。实际上,MySQL 支持很多数据类型,包括整数类型、实数类型、字符串类型、枚举类型、时间类型等。

整数类型

对于整数类型,可以使用 TINYINT、 SMALLINT、 MEDIUMINT、 INT、 BIGINT 等。每个整数类型都对应着不同的存储空间。

数据类型 存储(Bytes)
TINYINT 1
SMALLINT 2
MEDIUMINT 3
INT 4
BIGINT 8

当使用整数类型时,存在一些使用细节,这里,给读者进行说明。

整数类型可以选择 UNSIGNED 属性,表示不允许负数,这样可以使得正数的上限提高一倍。举个例子,INT 的存储范围是 -2-31 ~ 231 - 1,也就是 -2147483648 ~ 2147483647,那么 UNSIGNED INT 可以存储的范围就是 0 ~ 263 - 1,即 0 ~ 9223372036854775807。

整数类型可以指定宽度,然而对大多数场景是没有意义的,它并不会限制整数类型的合法范围,它只是规定某些交互工具显示出来的字符个数。如果不显示地指定宽度,则默认为 INT(11)。有读者会误认为 INT(11) 指定整数类型的长度是 11 位,这个想法是错误的。实际上,在 Zerofill 属性中,表示当数组宽度小于 11 位时,在数字前面加 0 填满宽度。

更小的数据类型通常更快,因为占用更少的磁盘空间。举个例子,如果需要存储性别状态(1-男;2-女;99-未知),这个时候应该优先考虑 TINYINT,而不是 INT,因为 TINYINT 占用更少的磁盘空间。因此,需要选择合适的整数类型来减少占用的磁盘空间,而不是选择全部使用 INT 或 BIGINT。

实数类型

对于实数类型,可以使用 FLOAT、 DOUBLE、 DECIMAL 等。每个实数类型都对应着不同的存储空间。

数据类型 存储(Bytes)
FLOAT 4
DOUBLE 8

FLOAT(M,D) 和 DOUBLE(M,D) 表示一共显示 M 位整数,D 位小数。举个例子,FLOAT(5,2) 可以显示为 100.99。此外,读者还要注意的是,MySQL 保存时会进行四舍五入,因此,如果值为 100.0099, 会保存近似结果 100.01。

FLOAT 只保证 6 位有效数字的准确性,所以 FLOAT(M,D) 中,M<=6 时,数字通常是准确的。

DOUBLE 只保证 16 位有效数字的准确性,所以 DOUBLE(M,D) 中,M<=16 时,数字通常是准确的。

在使用实数类型,要重点考虑精度问题。DOUBLE 是 MySQL 内部浮点计算的类型,它比 FLOAT 有更高的精度和更大的范围,但是 FLOAT 和 DOUBLE 都是不精确的,如果要实现精确浮点运算,就需要使用 DECIMAL 类型。

因此,如果需要考虑精度问题,优先考虑 DECIMAL 类型。如果对精度问题不是特别敏感,可以考虑使用 FLOAT 或者 DOUBLE 类型。

字符串类型

对于实数类型,可以使用 CHAR、 VARCHAR、 BLOB、 TEXT 等。

CHAR 类型是定长的。MySQL 会根据定义的长度分配空间。CHAR 长度可以是 0 到 255之间的值。

VARCHAR 类型用于存储可变长字符串,它更加节省空间。值得注意的是, VARCHAR 实际上会使用 1 或 2 个额外字节记录字符串的长度。VARCHAR 长度可以指定 0 到 65535 之间的值。

BLOB 和 TEXT 主要用来存储大文本,分别采用二进制和字符串方式存储。如果 BLOB 和 TEXT 还无法满足需求,还可以使用 TINYBLOB、 MEDIUMBLOB、 LONGBLOB、 TINYTEXT、 MEDIUMTEXT、 LONGTEXT。值得注意的是,它们不能够有默认值。

对于字符串类型的使用场景,可以大概总结下。

定长的字符串,可以选择 CHAR。举个例子,身份证是定长类型,那么选择 CHAR 是非常合适的。

变长的字符串,可以选择 VARCHAR, 因为 VARCHAR 更加节省空间。

存储大文本的场景,可以考虑使用 BLOB 和 TEXT。如果 BLOB 和 TEXT 还无法满足需求,还可以使用 TINYBLOB、 MEDIUMBLOB、 LONGBLOB、 TINYTEXT、 MEDIUMTEXT、 LONGTEXT。

枚举类型

实际上, 枚举类型保存的是整数类型,但其显示为字符串。如果将一个非法值插入,即允许的值之外的字符串,枚举类型将不允许操作,但是枚举类型允许空字符串和 NULL 类型。

尽量不要使用枚举类型,因为枚举类型增加了维护成本。试想,如果需要增加新的枚举类型,需要全表更新,如果对于大数据量的更新场景,会造成锁表,这是多么恐怖的事情。

时间类型

对于时间类型,MySQL 提供了丰富的数据类型: YEAR、 DATE、 TIME、 DATETIME、 TIMESTAMP。每个时间类型都对应着不同的时间格式。

数据类型 时间格式 案例
YEAR 0000 2017
DATE 0000-00-00 2017-01-01
TIME 00:00:00 01:01:01
DATETIME 0000-00-00 00:00:00 2017-01-01 01:01:01
TIMESTAMP 0000-00-00 00:00:00 2017-01-01 01:01:01

MySQL 能够存储的最小单位是秒,如果需要更精确的存储,就必须自己定义存储格式。

MySQL 时间类型是存在范围的。

数据类型 范围
DATE ‘1000-01-01’ ~ ‘9999-12-31’
DATETIME ‘000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’
TIMESTAMP ‘1970-01-01 00:00:01’UTC ~ ‘2038-01-19 03:14:07’ UTC

DATETIME 和 TIMESTAMP 都可以存储相同类型的数据,而 TIMESTAMP 只使用 DATETIME 一半的存储空间。通常情况下,建议优先考虑 TIMESTAMP,因为它的空间利用率更高。

(完)

微信公众号

文章目录

  1. 1. 整数类型
  2. 2. 实数类型
  3. 3. 字符串类型
  4. 4. 枚举类型
  5. 5. 时间类型