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

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

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

字符串

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

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

二进制字符串类型

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

非二进制字符串类型

数据类型定义 存储空间占用量范围 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYTEXT 0-255 bytes 短文本字符串
TEXT 0-65 535 bytes 长文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

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

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

1
scss复制代码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 类型的字段,只能存储预先定义好的字符串值。

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

日期和时间

类型 大小 格式 范围
DATE 3 bytes YYYY-MM-DD 1000-01-01 ~ 9999-12-31
TIME 3-6 bytes HH::MM:SS[.微秒] -838:59:59 ~ 838:59:59
YEAR 1 bytes YYYY 1901 ~ 2155
DATETIME 5-8 bytes YYYY-MM-DD HH:MM:SS[.微秒值] 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 UTC
TIMESTAMP 4-7 bytes YYYY-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 数值数据类型。其实对于数值类型来说,类型可分为整数类型、定点型类型、浮点数类型、位类型四种类型。

类型 大小 用途
TINYINT 1 byte 小整数值
SMALLINT 2 bytes 大整数值
MEDIUMINT 3 bytes 大整数值
INT或INTEGER 4 bytes 大整数值
BIGINT 8 bytes 极大整数值
FLOAT 4 bytes 单精度 浮点数值
DOUBLE 8 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 提供的最常用的数据类型以及它们的特性适用场景的介绍完毕了。除了要记住这些特性之外,更多的是不断的尝试应用和总结,得出你自己的结论。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%