11 MySQL 的数据类型(2)
这一小节我们继续学习 MySQL 数据库的数据类型上一小节学习了整数类型和浮点类型,本小节介绍日期时间类型和字符串类型。
1.日期和时间类型
类型 | 大小 | 格式 | 范围 |
---|---|---|---|
date | 3字节 | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 |
time | 3-6字节 | HH::MM:SS[.微秒] | -838:59:59 ~ 838:59:59 |
year | 1字节 | YYYY | 1901 ~ 2155 |
datetime | 5-8字节 | YYYY-MM-DD HH:MM:SS[.微秒值] | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 UTC |
timestamp | 4-7字节 | YYYY-MM-DD HH:MM:SS[.微秒值] | 1970-01-01 00:00:00 ~ 2038-01-19 03:14:07 UTC |
1.1 date
date 类型为日期类型,存储空间 3个字节,格式为 “YYYY-MM-DD”,例如 “2020-03-16”,日期的范围 “1000-01-01 ~ 9999-12-31”,通常只想用来存储如 “2020-02-02” 这种格式的日期字段时,可以选择使用 date 类型。
1.2 time
time 类型为时间类型,存储空间 3 ~ 6个字节,格式为 “HH::MM:SS[.微秒]” ,例如 “04:31:22.33”,范围 “-838:59:59 ~ 838:59:59”,通常只想用来存储如 “04:31:22.33” 这种格式的时间字段时,可以选择使用 time 类型。
1.3 year
year 类型为日期类型,存储空间 1 个字节 ,例如 “2020”,范围 “1901 ~ 2155”,通常只想用来存储如 “2020” 这种格式的日期字段时,可以选择使用 year 类型。
1.4 datetime
datetime 类型为精确时间的日期类型,存储空间为 5 ~ 8 个字节,格式为 “YYYY-MM-DD HH:MM:SS[.微秒值]”,例如 “2020-02-02 02:02:02.02”,范围 “1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 UTC”,通常只想用来存储如 “2020-02-02 02:02:02.02” 这种格式的日期字段时,可以选择使用 datetime 类型。
1.5 timestamp
timestamp 类型保存了从1970年01月01日午夜以来的秒数,它和 UNIX 时间戳相同,存储空间 4 ~ 7 个字节,范围 “1970-01-01 00:00:00 ~ 2038-01-19 03:14:07 UTC”,timestamp 显示的值依赖于时区,和 datetime 相比,前者提供的值与时区有关系,后者则保留文本表示的日期和时间。
2.字符串类型
类型 | 范围 | 说明 |
---|---|---|
char | 1~255个字符 | 固定长度 |
varchar | 字段存储所占字节数不能超过65535字节 | 可变长度 |
tinytext | 最大长度255字节 | 可变长度 |
text | 最大长度65535个字节 | 可变长度 |
mediumtext | 最大长度16777215个字节 | 可变长度 |
longtext | 最大长度4294967295个字节 | 可变长度 |
2.1 char
char 类型为定长字符串类型,适合存储很短的字符串,或者所有值都接近同一个长度,例如存储密码 md5 值,因为它是一个定长的值,对于经常变更的数据,char 比 varchar 更好,因为定长的 char 不容易产生碎片。
2.2 varchar
varchar 类型用于存储可变长度字符串,是最常见的字符串数据类型,对于短长度的字符串,它比定长的更为节省空间,varchar 节省空间对性能有帮助,varchar 类型的字符串有如下特点 :
- 字符串列的最大长度比平均长度大;
- 列的更新少,碎片问题较小;
- 使用了如 “UTF-8” 字符集,每个字符都使用不同的字节数来存储。
2.3 text
text 数据类型家族包括 : tinytext、text、mediumtext、longtext。 MySQL 把每个 text 值当做一个独立的对象处理。若 text 家族的值太大时,InnoDB 存储引擎会额外使用存储区域来进行存储,通常存储文章这样比较长的内容字段时,可选择 text 家族类型。
3.枚举值类型
类型 | 范围 | 说明 |
---|---|---|
enum | 几何数最大65535 | 枚举值类型,只能插入列表中指定的值 |
3.1 enum
enum 类型为枚举值类型,有时可以使用枚举值替代字符串,枚举列可以把一些不重复的字符串存储为一个预定义的集合。 MySQL 在存储枚举时非常紧凑,会根据列表值的数量压缩到 1 ~ 2 个字节,例如 ENUM (‘黄色’,‘黑色’,‘蓝色’,‘紫色’),枚举值类型字段的需求也可以使用 tinyint 类型来替代。
4.二进制类型
类型 | 范围 | 说明 |
---|---|---|
tinyblob | 最大长度255字节 | 可变长度 |
blob | 最大长度65535个字节 | 可变长度 |
mediumblob | 最大长度16777215个字节 | 可变长度 |
longblob | 最大长度4294967295个字节 | 可变长度 |
4.1 blob
blob 数据类型家族包括 :tinybob、blob、mediumblob、longblob。和 text 家族一样,MySQL 把每个 text 值当做一个独立的对象处理。若 blob 家族的值太大时,InnoDB 存储引擎会额外使用存储区域来进行存储,blob 类型存储的是二进制数据,没有排序规则或字符集。
5.小结
本小节主要介绍了 MySQL 日期时间类型和字符串类型,需要注意的是时间类型 TIME、DATETIME、TIMESTAMP 存储大小具体取决于微秒值,例如 TIME 类型,当微秒不存在的时候如 “12:12:12” 字节数为 3 字节(微秒 0 字节)"12:12:12.72"表示微秒 2 位,总共4字节(微秒1字节),“12:12:12.6173” 表示微秒 4 位,总共 5 字节(微秒2字节),“12:12:12.627127” 表示微秒 6 位,总共 6 字节,微秒字节位数对表如下:
微秒位数 | 大小 | 举例 |
---|---|---|
0 | 0字节 | 12:12:12 |
1,2 | 1字节 | 12:12:12.3 或 12:12:12.32 |
3,4 | 2字节 | 12:12:12.326 或 12:12:12.3653 |
5,6 | 3字节 | 12:12:12.35812 或 12:12:12.352161 |
另外还需要注意 char 类型是一种固定长度的类型,varchar 则是一种可变长度的类型,它们的区别是:char(M) 类型的数据列里,每个值都占用 M 个字节,如果某个长度小于 M,MySQL 就会在它的右边用空格字符补足.。