一段话系列-MySQL中date、datetime、timestamp的区别以及取舍

三者之间的区别(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

转载于:https://my.oschina.net/u/2312080/blog/3016702

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值