永远不要将任何应用程序值存储到 MySQL 时间戳类型列中。仅将时间戳类型用于数据库服务器端动态时间戳(请参阅 DEFAULT 和 ON UPDATE 列属性)。通过调用列“mysql_row_created_at”和“mysql_row_updated_at”来明确说明。
请注意,MySQL 将其时间戳类型物理存储为数字 UNIX-epoch-delta,因此它具有 UTC 的隐式时区,这使其不受会话(AKA 连接)级别的时区更改的影响。
远离“日期时间”类型,在存储任何具有已知时区的值时更是如此。'datetime' 类型很像一串压缩数字。没有存储时区详细信息。
“日期”类型通常可以使用。请注意,尽管在某些情况下,它将被解释为(活动时区的)午夜的日期时间,这将导致您应该避免的所有与“日期时间”相关的混淆。
对于任何应用程序端的日期时间值,使用“int unsigned”、“bigint”(有符号)、“double”(有符号)或小数(N,P)来简单地存储 UNIX-epoch-deltas . 如果不是秒,请确保在列名后缀中显示分辨率。
例子:
`mysql_row_created_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
`mysql_row_updated_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`epoch` int unsigned NOT NULL,
`epoch_ms` bigint NOT NULL,
`epoch_us` bigint NOT NULL,
`epoch` double NOT NULL,
`epoch6` decimal(16,6),
尽可能多地对待您的数据库作为哑存储。所以只能在应用程序端进行任何转换,而不是在数据库端。
很高兴知道:
SELECT @@GLOBAL.TIME_ZONE
, @@SESSION.TIME_ZONE
, @@SESSION.TIMESTAMP
, UNIX_TIMESTAMP(NOW(6))
;