「这是我参与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 提供的最常用的数据类型以及它们的特性适用场景的介绍完毕了。除了要记住这些特性之外,更多的是不断的尝试应用和总结,得出你自己的结论。
本文转载自: 掘金