跨国业务的数据库时区方案

本文默认mysql版本大于5.7,之前版本对datetime不支持毫秒,同一个表里不允许有多个自动更新的时间字段

  • 建表语句如下,创建时间和更新时间由数据库自动维护、精确到毫秒。字符集utf8mb4、区分大小写
CREATE TABLE IF NOT EXISTS `test`
(
    `id`          bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
    `create_time`   datetime(3)         NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
    `update_time`   datetime(3)         NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT ='测试表';
  • 现在都2021年了,时间字段就不要再用timestamp字段了
  • datetime类型没有和时区没关系,比如在东八区写入了2021-07-31 14:45:39.202,在东九区读出来依然是2021-07-31 14:45:39.202
  • CURRENT_TIMESTAMP函数根据mysql服务设置的时区,获得对应时区的当前时间
  • datetime在mysql存储的时候实际存储的就是20210731144539202这个数字,所以和时区无关
  • 所以对跨境业务,在不同国家的数据库最好约定好一个统一的时区,建议都用utf+0,这样不同国家的服务从数据库中读出来在根据时区自己转换就好

    出于合规要求,数据是不允许跨境流动的,所以不同国家的服务都应该有一个独立的数据库,而不是所有国家的服务公用一个数据库。但是一些小公司做跨境电商类的可能不会这么规范,真的就是共用一个数据库了

你可能感兴趣的:(跨国业务的数据库时区方案)