You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL数据库中存储带毫秒时间戳的最佳数据类型选型

适合存储带毫秒时间戳的MySQL数据类型推荐

嘿,刚好碰到过类似的需求,给你详细说下怎么处理:

首先得澄清一个小误区:MySQL的DATETIMETIMESTAMP类型在5.6.4及以后的版本其实是支持小数秒(也就是你要的毫秒)的,只是可能你查阅的文档没专门高亮这部分内容~

下面是最适合的两种数据类型,根据你的业务场景选就行:

  • DATETIME(3):这是最通用的选择

    • 范围覆盖1000-01-01 00:00:00.0009999-12-31 23:59:59.999,完全满足你需要的毫秒精度(括号里的3表示保留3位小数,对应毫秒级别)
    • 存储的是字面时间,不依赖服务器时区,适合不需要时区转换的业务场景
  • TIMESTAMP(3):适合需要时区自动转换的场景

    • 范围是1970-01-01 00:00:01.0002038-01-19 03:14:07.999,注意有时间范围限制
    • 会根据MySQL服务器的时区自动转换存储和查询的时间,比如你插入的是UTC时间,查询时会转换成服务器时区的时间,适合跨时区的业务

给你举个实际的建表和插入数据的例子:

-- 创建带毫秒精度时间字段的表
CREATE TABLE event_logs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    event_datetime DATETIME(3) NOT NULL,
    event_timestamp TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
);

-- 插入你格式的时间值
INSERT INTO event_logs (event_datetime) VALUES ('2017-09-07 00:00:31.150');

另外要注意:DATE类型确实不支持时间和毫秒部分,它只存储日期(YYYY-MM-DD),所以肯定不能用。

如果你的MySQL版本低于5.6.4(这种情况现在很少见了),那可能需要变通处理,比如用DATETIME字段存到秒,再加一个单独的INT字段存毫秒值,但还是建议尽量升级到高版本用原生支持的方式更方便。

内容的提问来源于stack exchange,提问作者Dan

火山引擎 最新活动