选择合适的数据类型以及恰当的范围

806 阅读10分钟

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

MySQL 数据库中一共去定义了四类数据类型,而且它们都有不同的取值范围,也就是合法的取值区域。对于业务开发来说,选择合适的数据类型往往是很简单的。比如你存储姓名,肯定是用字符串,存储年龄你会选择整形数字等等。所以这里的焦点其实是各个数据类型的取值范围对业务发展的影响。

字符串

字符串类型是MySQL中最常用的数据类型,也是比较灵活的数据类型,学习字符串数据,也会讨论到字符集与转义字符等知识,因为比较复杂。MySQL的字符串类型都可以用于去存储字符串。

MySQL的字符串数据类型可以分为 二进制字符串类型非二进制字符串类型两种。

二进制字符串类型

数据类型定义存储空间占用量范围用途
BINARY0-255 bytes固定长度二进制字符串
VARBINARY0-65535 bytes可变长度二进制字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
BLOB0-65 535 bytes二进制形式的长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据

非二进制字符串类型

数据类型定义存储空间占用量范围用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYTEXT0-255 bytes短文本字符串
TEXT0-65 535 bytes长文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

它们不仅仅在取值范围上有不同的取值区域,更大的区别是它们存储数据的方式。对于取值范围来说,我们当然不可能都把它们都记住。MySQL 也想到了这个问题,提供了 help 命令,然后我们可以去查询数据类型的使用范围。

这里给大家去演示一下使用 help 命令去看一看 char 数据类型。查看命令如下:

help char

使用 help 帮助命令查看 char 数据类型的结果如下所示。

image-20210321225219832

我们可以从 MySQL 给出的描述中,可以看到 char 数据类型的用于去定义一个固定长度的字符串。而且它的长度范围是从 0255 之间,且必须是在创建表的时候去指定的。它有一个特殊的情况,这个存储字符串的时候,如果没有达到一个指定的长度,MySQL 会使用空格去填充指定长度。如果我们想要去存储不同记录的字符串的长度差别比较大,就会造成比较大的空间浪费。

如果我们存储的数据长度浮动范围非常大,就可以考虑使用到 varchar 去存储,这种数据类型是你需要多少空间就会使用多少空间,而 varchar 的取值范围是1~65535,不过 varchar 的最大长度一般小于 65535,因此 MySQL 中数据行的最大长度也是65535,何况 varchar 还需要额外两个字节来记录其目前的存储长度。

BINARYVARBINARY 类似于 CHARVARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是包含 TINYBLOBBLOBMEDIUMBLOBLONGBLOB 系列数据类型的家族,用于存储二进制字符串,比如图片、声音等数据,而 TEXT 是包含 TINYTEXTTEXTMEDIUMTEXTLONGTEXT 系列数据类型的家族用于存储非二进制字符串,所以 TEXT 系列的类型存储与解析与字符集有关。使用 MEMORY 存储引擎的数据表不支持 BLOBTEXT 这两种数据类型。

ENUM是一种特殊的字符串类型,占用1或2个字节,也就是说 ENUM 类型可以设置 65535 个成员,ENUM 类型与一般的字符串类型不同,设置为 ENUM 类型的字段,只能存储预先定义好的字符串值。

当我们需要存储的数据量比较大的时候,就应该考虑使用到文本。这里我给出一个建议,如果当你所要存储的数据量超过五百个字符的时候,就应该考虑去使用文本。另外文本类型不能有默认值。 而且在创建索引的时候,需要去指定它前多少个字符是成为索引的。

日期和时间

类型大小格式范围
DATE3 bytesYYYY-MM-DD1000-01-01 ~ 9999-12-31
TIME3-6 bytesHH::MM:SS[.微秒]-838:59:59 ~ 838:59:59
YEAR1 bytesYYYY1901 ~ 2155
DATETIME5-8 bytesYYYY-MM-DD HH:MM:SS[.微秒值]1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 UTC
TIMESTAMP4-7 bytesYYYY-MM-DD HH:MM:SS[.微秒值]1970-01-01 00:00:00 ~ 2038-01-19 03:14:07 UTC

根据表格可以得出大致的区别以及适用范围了。

DATE 数据类型用于存储日期,占用3个字节,,默认零值为0000-00-00,通常只想用来存储如 “2021-03-02” 这种格式的日期字段时,可以选择使用 DATE 类型。

TIME 类型占用3个字节,注意 TIME 类型并不是表示时分秒,而表示逝去的一段时间,即表示两个事件之间的时间间隔,所以 TIME 类型可以为负值。通常只想用来存储如 “04:31:22.33” 这种格式的时间字段时,可以选择使用 TIME 类型。

DATETIME 数据类型则是 DATETIME 两个种数据类型的一个组合格式,它是最常见于用途最广的数据类型。通常只想用来存储如 “2020-02-02 02:02:02.02” 这种格式的日期字段时,可以选择使用 DATETIME 类型。

TIMESTAMP 数据类型是用于保存日期与时间的组合值的,与时区相关,默认是以UTC (世界标准时间)的格式存储的,当我们从数据中查询 TIMESTAMP 的数据列,会根据我们当前的时区自动转换值,它与 DATETIME 的这个存储的数据格式是一样的,主要区别它会比这个 DATETIME 的存储的这个时间范围要小一些,而且前者提供的值与时区有关系,后者则保留文本表示的日期和时间。

YEAR 类型为日期类型,通常只想用来存储如 “2021” 这种格式的日期字段时,可以选择使用 YEAR 类型。

数值类型

MySQL 支持所有标准 SQL 数值数据类型。其实对于数值类型来说,类型可分为整数类型、定点型类型、浮点数类型、位类型四种类型。

类型大小用途
TINYINT1 byte小整数值
SMALLINT2 bytes大整数值
MEDIUMINT3 bytes大整数值
INT或INTEGER4 bytes大整数值
BIGINT8 bytes极大整数值
FLOAT4 bytes单精度 浮点数值
DOUBLE8 bytes双精度 浮点数值
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2小数值

整数类型用于存储整数,根据其存储的字节大小可分为 TINYINTSMALLINTMEDIUMINTINTBIGINT

TINYINT为小整数类型,有符号范围-128 ~ 127,无符号范围 0 ~ 255,此类型通常在数据库中表示类型的字段,如某一字段 TYPE 表示学科,其中 “type=1” 表示语文,“type=2” 表示数学, “type=3” 表示英语,此时 TYPE 字段即可使用 TINYINT这种存储空间比较小的类型。

SMALLINT为小整数类型,有符号范围 -32768 ~ 32767,无符号范围 0 ~ 65535,当遇到最大值不超过 65535 的整数类型字段时,可使用无符号 SMALLINT 类型。

MEDIUMINT为中整数类型,有符号范围 -8388608 ~ 8388607,无符号范围 0 ~ 16777215,当遇到最大值不超过 16777215 的整数类型字段时,可使用无符号 MEDIUMINT类型。

INT为整数类型,无符号范围 0 ~ 49294967295,当遇到最大值不超过 49294967295 的整数类型字段时,可使用无符号 INT类型,通常自增主键 id 使用 INT类型。

BIGINT 为大整数类型,存储空间8个字节(64位),有符号范围 -9223372036854775808 ~ 9223372036854775807,无符号范围 0 ~ 18446744073709551615,当遇到最大值不超过 18446744073709551615 的整数类型字段时,可使用无符号 BIGINT 类型,通常自增主键 id 使用 INT无法满足时,可以使用 BIGINT类型。

FLOATDOUBLE 属于浮点类型。FLOAT 为单精度浮点类型,支使用标准的浮点运算进行近似计算,若想知道浮点运算是怎么计算的,则需要研究操作系统的浮点数方式,通常对小数精度要求不那么高的字段可使用 FLOAT 类型。DOUBLE 为双精度浮点类型,相比 DOUBLE 有更高精度和更大的范围,通常对小数精度要求不那么高,但比 DOUBLE 要求更高的字段可使用 double 类型。

DECIMAL 属于定点的数据类型,保存的是精确的值,通常用于这个精度要求非常高的计算中。若使用 FLOAT 类型来取代一些需要精确小数点类型的字段时,大的数据量会导致数据错误,比如金额,若使用 FLOAT 类型,可能会丢失精度,此时对于金额这样对精度要求很高的字段来说,可以选择使用 DECIMAL 类型。

二进制数据类型

二进制数据类型,理论上可以存储任何数据,可以是文本数据,也可以存储图像或者其他多媒体数据。二进制数据类型相对于其他的数据来一起来说,使用频率是比较低的。

MySQL 数据库一共提供了四种二进制类型,分别是 TITYBLOBBLOB, MEDIUMBLOBLONGLOB. 它们的区别是在于这个存储范围的不同。我们可以根据名字去判断区分.

需要注意,虽然 MySQL 提供并且支持大文件的存储,但是这样会急剧降低数据库的性能。所以应该谨慎使用这些数据类型,能够不用的情况下呢,就尽量不用。

MySQL 提供的最常用的数据类型以及它们的特性适用场景的介绍完毕了。除了要记住这些特性之外,更多的是不断的尝试应用和总结,得出你自己的结论。