一段话系列-MySQL中date、datetime、timestamp的区别以及取舍
时间: 2019-03-01来源:OSCHINA
前景提要
「深度学习福利」大神带你进阶工程师,立即查看>>>
三者之间的区别(mysql 5.6+)
存储范围 占用空间(字节) 是否与时区相关 默认值 存储方式 编码方式 是否根据时区转换 date 1000-01-01

9999-12-31 3 无关 null 二进制 1bit用来存符号位,表示正负
1 bit sign (1= non-negative, 0= negative)
17bit用来存放年和月
17 bits year*13+month (year 0-9999, month 0-12)
5bit用来存放日
5 bits day (0-31)
---------------------------
一共23bit约为3个字节
23 bits = 3 bytes 否
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用来存放年和月
17 bits year*13+month (year 0-9999, month 0-12)
5bit用来存放日
5 bits day (0-31)
5bit用来存放时
5 bits hour (0-23)
5bit用来存放分
6 bits minute (0-59)
5bit用来存放秒
6 bits second (0-59)
---------------------------
一共40bit刚好5个字节
40 bits = 5 bytes 否
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

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行