MySQL 中罕用的两种工夫贮存类型别离是datetimetimestamp。如何在它们之间抉择是建表时必要的思考。上面就谈谈他们的区别和怎么抉择。

1 区别

1.1 占用空间

类型占据字节示意模式
datetime8 字节yyyy-mm-dd hh:mm:ss
timestamp4 字节yyyy-mm-dd hh:mm:ss

1.2 示意范畴

类型示意范畴
datetime'1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'
timestamp'1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'

timestamp翻译为汉语即"工夫戳",它是以后工夫到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数。对于某些工夫的计算,如果是以 datetime 的模式会比拟艰难,如果我是 1994-1-20 06:06:06 出世,当初的工夫是 2016-10-1 20:04:50 ,那么要计算我活了多少秒钟用 datetime 还须要函数进行转换,然而 timestamp 间接相减就行。

1.3 时区

timestamp 只占 4 个字节,而且是以utc的格局贮存, 它会自动检索以后时区并进行转换。

datetime以 8 个字节贮存,不会进行时区的检索.

也就是说,对于timestamp来说,如果贮存时的时区和检索时的时区不一样,那么拿进去的数据也不一样。对于datetime来说,存什么拿到的就是什么。

还有一个区别就是如果存进去的是NULLtimestamp会主动贮存以后工夫,而 datetime会贮存 NULL

2 测试

咱们新建一个表

插入数据

查看数据,能够看到存进去的是NULLtimestamp会主动贮存以后工夫,而 datetime会贮存NULL

把时区批改为东 9 区,再查看数据,会会发现 timestampdatetime 多一小时

如果插入的是有效的呢?如果插入的是工夫戳

后果是0000-00-00 00:00:00,依据官网的解释是插入的是有效的话会转为 0000-00-00 00:00:00,而工夫戳并不是MySQL无效的工夫格局。

那么什么模式的能够插入呢,上面列举三种

//上面都是 MySQL 容许的模式,MySQL 会主动解决2016-10-01 20:48:592016#10#01 20/48/5920161001204859

3 抉择

如果在工夫上要超过Linux工夫的,或者服务器时区不一样的就倡议抉择 datetime

如果是想要应用主动插入工夫或者自动更新工夫性能的,能够应用timestamp

如果只是想示意年、日期、工夫的还能够应用 yeardatetime,它们别离占据 1、3、3 字节,而datetime就是它们的汇合。