MySQL 学习 之 你还在用 TIMESTAMP 吗?

目录

  • 1. 弊端
    • 1.1. 取值范围
    • 1.2. 时区依赖
    • 1.3. 隐式转换
  • 2. 区别
  • 3. 解决

1. 弊端

1.1. 取值范围

TIMESTAMP 的取值范围为 1970-01-01 00:00:01 UTC2038-01-19 03:14:07 UTC,超出范围的数据会被强制归零或触发异常‌。

具体表现为在基金债券等业务中,到期日可能是一个比较晚的未来的时间,很可能就会出现超出 TIMESTAMP 范围的时间。

现在已经 2025 年了,系统崩溃只在眨眼之间!!!

1.2. 时区依赖

存入时自动转换为 UTC 时间,查询时根据会话时区转换回本地时间。若时区配置不一致,同一时间在不同服务器显示结果不同‌

1.3. 隐式转换

存入 NULL 会自动填充为当前时间

2. 区别

特性 TIMESTAMP DATETIME
存储机制 整数(Unix 时间戳) 字符串(YYYY-MM-DD HH:MM:SS
存储空间 4 字节(旧版)或 7 字节(MySQL 5.6+) 8 字节
时区处理 自动转换为 UTC 存储并转换回会话时区 无视时区,直接存储原始值
取值范围 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
默认值支持 支持 CURRENT_TIMESTAMP 自动初始化 需显式声明
2038 年问题 ❗ 2038 年后溢出 ✅ 无此限制
NULL 处理 自动填充为当前时间 保持 NULL

3. 解决

2038 年后必须迁移至 DATETIME;跨国系统优先 DATETIME 减少时区风险‌。

你可能感兴趣的:(mysql,学习,数据库)