三者之间的区别(mysql 5.6+)
存储范围 | 占用空间(字节) | 是否与时区相关 | 默认值 | 存储方式 | 编码方式 | 是否根据时区转换 | |
---|---|---|---|---|---|---|---|
date | 1000-01-01 至 9999-12-31 | 3 | 无关 | null | 二进制 | 1bit用来存符号位,表示正负 1 bit sign (1= non-negative, 0= negative) 17bit用来存放年和月 5bit用来存放日 一共23bit约为3个字节 | 否 |
datetime | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | 5 当保存毫秒部分时使用额外的空间 (1到3 字节) | 无关 | null | 二进制 | 1bit用来存符号位,表示正负 1 bit sign (1= non-negative, 0= negative) 17bit用来存放年和月 5bit用来存放日 5bit用来存放时 5bit用来存放分 5bit用来存放秒 一共40bit刚好5个字节 | 否 |
timestamp | 1970-01-01 00:00:00 至 2038-01-09 03:14:07 | 4 当保存毫秒部分时使用额外的空间 (1到3 字节) | 相关 | CURRENT_TIMESTAMP(当前时间) 默认情况下, insert、update 数据时,TIMESTAMP列会自动以当前时间填充/更新 | 二进制 | 存的是自【1970-01-01,UTC】以来的秒数。 | 是 |
PS:在5.6版本之后,datetime开始可以使用current time作为默认值,所以不再有timestamp比datetime更适合作为需要随插入和更新来变更时间的类型的说法
date这个主要是表示日期的,用途上面没有什么需要抉择的。
对于timestamp和datetime,道友们可能还有选择困难症,在这里我发表一下自己的看法:
在5.6+的mysql数据库中,timestamp这个基本可以弃用了,以datetime为主。如果遇到跨时区的需求时,建议使用long或者bigint进行时间戳的存储,然后在代码中进行转换,不建议用timestamp;
Mysql相关文档:https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html
参考博文:https://juejin.im/entry/5b6fcb1b6fb9a009d15a2c5c