MySQL数据库中存储带毫秒时间戳的最佳数据类型选型
适合存储带毫秒时间戳的MySQL数据类型推荐
嘿,刚好碰到过类似的需求,给你详细说下怎么处理:
首先得澄清一个小误区:MySQL的DATETIME和TIMESTAMP类型在5.6.4及以后的版本其实是支持小数秒(也就是你要的毫秒)的,只是可能你查阅的文档没专门高亮这部分内容~
下面是最适合的两种数据类型,根据你的业务场景选就行:
DATETIME(3):这是最通用的选择- 范围覆盖
1000-01-01 00:00:00.000到9999-12-31 23:59:59.999,完全满足你需要的毫秒精度(括号里的3表示保留3位小数,对应毫秒级别) - 存储的是字面时间,不依赖服务器时区,适合不需要时区转换的业务场景
- 范围覆盖
TIMESTAMP(3):适合需要时区自动转换的场景- 范围是
1970-01-01 00:00:01.000到2038-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




