「这是我参与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
数据类型的结果如下所示。
我们可以从 MySQL
给出的描述中,可以看到 char
数据类型的用于去定义一个固定长度的字符串。而且它的长度范围是从 0
到 255
之间,且必须是在创建表的时候去指定的。它有一个特殊的情况,这个存储字符串的时候,如果没有达到一个指定的长度,MySQL
会使用空格去填充指定长度。如果我们想要去存储不同记录的字符串的长度差别比较大,就会造成比较大的空间浪费。
如果我们存储的数据长度浮动范围非常大,就可以考虑使用到 varchar
去存储,这种数据类型是你需要多少空间就会使用多少空间,而 varchar
的取值范围是1~65535,不过 varchar
的最大长度一般小于 65535,因此 MySQL
中数据行的最大长度也是65535,何况 varchar
还需要额外两个字节来记录其目前的存储长度。
BINARY
和 VARBINARY
类似于 CHAR
和 VARCHAR
,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB
是包含 TINYBLOB
、BLOB
、MEDIUMBLOB
、LONGBLOB
系列数据类型的家族,用于存储二进制字符串,比如图片、声音等数据,而 TEXT
是包含 TINYTEXT
、TEXT
、MEDIUMTEXT
、LONGTEXT
系列数据类型的家族用于存储非二进制字符串,所以 TEXT
系列的类型存储与解析与字符集有关。使用 MEMORY
存储引擎的数据表不支持 BLOB
和 TEXT
这两种数据类型。
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
数据类型则是 DATE
和 TIME
两个种数据类型的一个组合格式,它是最常见于用途最广的数据类型。通常只想用来存储如 “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 | 小数值 |
整数类型用于存储整数,根据其存储的字节大小可分为 TINYINT
,SMALLINT
,MEDIUMINT
、INT
、BIGINT
。
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
类型。
FLOAT
和 DOUBLE
属于浮点类型。FLOAT
为单精度浮点类型,支使用标准的浮点运算进行近似计算,若想知道浮点运算是怎么计算的,则需要研究操作系统的浮点数方式,通常对小数精度要求不那么高的字段可使用 FLOAT
类型。DOUBLE
为双精度浮点类型,相比 DOUBLE
有更高精度和更大的范围,通常对小数精度要求不那么高,但比 DOUBLE
要求更高的字段可使用 double 类型。
DECIMAL
属于定点的数据类型,保存的是精确的值,通常用于这个精度要求非常高的计算中。若使用 FLOAT
类型来取代一些需要精确小数点类型的字段时,大的数据量会导致数据错误,比如金额,若使用 FLOAT
类型,可能会丢失精度,此时对于金额这样对精度要求很高的字段来说,可以选择使用 DECIMAL
类型。
二进制数据类型
二进制数据类型,理论上可以存储任何数据,可以是文本数据,也可以存储图像或者其他多媒体数据。二进制数据类型相对于其他的数据来一起来说,使用频率是比较低的。
MySQL
数据库一共提供了四种二进制类型,分别是 TITYBLOB
,BLOB
, MEDIUMBLOB
,LONGLOB
. 它们的区别是在于这个存储范围的不同。我们可以根据名字去判断区分.
需要注意,虽然 MySQL
提供并且支持大文件的存储,但是这样会急剧降低数据库的性能。所以应该谨慎使用这些数据类型,能够不用的情况下呢,就尽量不用。
MySQL
提供的最常用的数据类型以及它们的特性适用场景的介绍完毕了。除了要记住这些特性之外,更多的是不断的尝试应用和总结,得出你自己的结论。
本文转载自: 掘金