以 mysql 来说,用 bigint 来存较好,优点 1. 存储值与时区无关 2. 不用考虑各台机器时区以及 mysql 所用时区不一致问题,缺点: 查询结果需做转换才能可读(mysql-cli/gui)
----
DATETIME: 存储的可以理解为就是你给它的值(yyyy-MM-dd HH:mm:ss),但是不会带上时区信息,所以如果各台机器时区不一致,那库里存的就不知道它的时区了
TIMESTAMP: 存储的可以理解为把你给它的值(yyyy-MM-dd HH:mm:ss)以 mysql 所用时区来理解,转成 UTC 时间来存储,所以如果程序所用时区与 mysql 所用时区不一致,那 mysql 就存错值了
----
那如果程序所用时区与 mysql 所用时区都全部一致,DATETIME 和 TIMESTAMP 有什么区别呢?
1. 各台机器 0 时区,mysqlA 0 时区,数据都在 mysqlA 上,mysqlB 用的是 1 时区,把 mysqlA 导出导入到 mysqlB 中
__DATETIME: A,B 查询结果一致,时区信息自己记得是 0 时区
__TIMESTAMP: A,B 查询结果不同,分别是各自 mysql 所用时区
( ps: 把 mysqlB 时区改一致不就完了......额,就以它不能改吧
2. 其它区别: 如取值范围。。(自己上网看
----
至于闰秒问题。不考虑 2333. [有看到建议取消闰秒](
https://zh.wikipedia.org/wiki/闰秒#建議取消閏秒)
TIMESTAMP 范围问题,程序能活到那个时候再说~(等 mysql 加大 TIMESTAMP 字节?
----
我有试过用 TIMESTAMP(3)的; java 程序里加 Filter 在取值设值时用程序所用时区和 mysql 所用时区差来调整时间
java.util.Date; json api 返回的话是用 Long 的。这样 sql 查库是可读的时间展示,但是其它语言程序好写这样的 Filter 吗?