MySQL系列(3): 基本数据类与类型选择
MySQL 支持多种数据类型来存储数据,包括数值类型、字符串类型、时间和日期类型、JSON格式类型。
本篇是对 MySQL 5.7 版本官方手册 **[MySQL 5.7 Reference Manual . Chapter 11 Data Types]**章节的简单汇总,便于快速查看。
下面的表显示了需要的每个整数类型的存储和范围。
常用类型
数值类型
MySQL 支持所有标准 SQL 数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
关键字 INT 是 INTEGER 的同义词,关键字 DEC 是 DECIMAL 的同义词。
BIT 数据类型保存位
字段值,并且支持 MyISAM、MEMORY、InnoDB 和BDB 表。
作为 SQL 标准的扩展,MySQL 也支持整数类型TINYINT、MEDIUMINT 和 BIGINT。
MySQL 对小数的表示,两种方式:浮点数和定点数,类型名后面跟(M,D)
来表示,M
指精度,表示共有 M 位数字(整数位 + 小数位), D
指标度,表示小数位。
- 浮点数:包括float(单精度)和double(双精度),在不指定精度和标度时,会按实际的精度来显示(由实际的硬件和操作系统决定);在指定了精度和标度时,若值范围超出,在保存时会进行四舍五入,系统不会报错。
- 定点数:只有decimal,在不指定精度和标度时,则按默认的整数位为 10,小数位为 0 存储(10,0),若超越了精度和标度,系统会报错。比浮点数精度高,适合用于表示货币等精度高的数据。
日期和时间类型
表示时间值的日期和时间类型为 DATETIME、DATE、TIMESTAMP、TIME 和 YEAR。
每个时间类型有一个有效值范围和一个 零 值,当指定了 MySQL 不能表示的值时会使用 零 值。
TIMESTAMP 类型与时区相关,保存时会转为 0 时区时间,取出时根据本地时区转为本地时间。
字符串类型
字符串类型是极其常用的数据类型,MySQL 为字符串类型提供了多个表示格式:CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM 和 SET。
CHAR
和 VARCHAR
类型类似,但它们保存和检索的方式不同。
- char 长度因定为创建字段时指定的长度,会删除末尾空格。
- varchar 是可变长字符串,占用空间为实际的字符长度,会保留末尾空格。
BINARY
和 VARBINARY
类似于 CHAR
和 VARCHAR
,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB
是一个二进制大对象,可以容纳可变数量的数据。
有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们只是可容纳值的最大长度不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。这些对应 4 种 BLOB 类型,有相同的最大长度和存储需求。
类型选择
在选择存储数据类型时,需要充分考滤所占用的存储空间,应尽可能使用最精确的类型。
- 如果是字符或字符串类型的,尽可能使用最精确的长度。
- 如果是数值类型的,尽可能确定有符号和无符号,如果不存在负数的情况,需指定为 UNSIGNED 以加大正数的取值范围。
例如,整数列用取值范围在 1-99999 ,则 MEDIUMINT UNSIGNED 为最佳类型,满足需求并使用最少的存储量。 - 使用 DECIMAL类型的列,所有基本计算(**+,-,*和/**)都是以 65位十进制精度完成的。如果精度要求不太重要,或要求计算速度优先,可以考虑使用 DOBLE 类型。
- 还可以把精确小数类型转存储在BIGINT类型,这样可以利用 64 位计算得到精确的数值,使用时把结果转换为浮点数。
相关参考
MySQL系列(3): 基本数据类与类型选择