Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL选择Datetime与Timestamp存储时间

MySQL如何选择Datetime与Timestamp存储时间

作者:冰川箭仙

本文主要介绍了MySQL如何选择Datetime与Timestamp存储时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

核心区别

特性DATETIMETIMESTAMP
存储空间8 字节4 字节
时间范围1000-01-01 ~ 9999-12-311970-01-01 ~ 2038-01-19
时区处理存储原始值,不转换存储为 UTC,读取时按会话时区转换
默认值可设固定值支持 CURRENT_TIMESTAMP 自动更新
自动更新需手动/触发器支持 ON UPDATE CURRENT_TIMESTAMP

选择建议

✅ 选择 DATETIME 当:

CREATE TABLE events (
    event_time DATETIME NOT NULL DEFAULT '2024-01-01 00:00:00',
    birthday DATETIME NOT NULL  -- 出生日期,固定不变
);

✅ 选择 TIMESTAMP 当:

CREATE TABLE users (
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

关键注意事项

1. TIMESTAMP 的 2038 年问题

2038-01-19 后 32 位 TIMESTAMP 会溢出。MySQL 8.0+ 已支持 64 位,但旧系统需警惕。

2. 时区陷阱

-- 会话时区改变,TIMESTAMP 显示值会变
SET time_zone = '+8:00';
SELECT ts FROM table;  -- 显示北京时间
SET time_zone = '+0:00';
SELECT ts FROM table;  -- 显示 UTC 时间(数值变了!)

DATETIME 不受此影响,始终显示存储时的原始值。

3. 混合使用策略(推荐)

CREATE TABLE orders (
    -- 面向用户的本地时间,固定不变
    order_time DATETIME NOT NULL,
    
    -- 内部审计/日志,带时区信息
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

总结

场景推荐类型
出生日期、历史日期、未来远期日期DATETIME
记录创建/修改时间、全球化应用TIMESTAMP
两者都需要混合使用

一句话原则:需要"人类看到的固定时间"用 DATETIME;需要"系统记录的瞬时时刻"用 TIMESTAMP。

到此这篇关于MySQL如何选择Datetime与Timestamp存储时间的文章就介绍到这了,更多相关MySQL选择Datetime与Timestamp存储时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文