当前位置: 首页 > news >正文

我们设计时间戳的更新时间的时候通常将字段类型设置为int或者bigint 这样能避免2038的问题吗

将时间戳存储为 INT 或 BIGINT 类型,是从根本上规避 MySQL TIMESTAMP 类型 2038 年问题的最佳实践。


为什么使用 INT/BIGINT 可以避免 2038 问题?

  1. 完全掌控存储格式

    • 当你使用 INT 或 BIGINT 时,你存储的只是一个数字。这个数字的含义(例如,是秒还是毫秒,从哪个纪元开始计算)完全由你的应用程序代码定义,与 MySQL 的 TIMESTAMP 实现无关。

    • 摆脱了 MySQL 对 TIMESTAMP 使用 32 位有符号整数的内部限制

  2. 巨大的范围优势

    • INT (UNSIGNED): 4 字节,范围是 0 到 4,294,967,295

      • 如果存储级时间戳(和 MySQL TIMESTAMP 一样),可以表示到 2106-02-07 06:28:15。这已经远超 2038,但对非常遥远的未来仍可能不够。

    • BIGINT (UNSIGNED): 8 字节,范围是 0 到 18,446,744,073,709,551,615

      • 这是一个天文数字。即使用毫秒为单位,也可以轻松使用数亿年,彻底一劳永逸地解决“Year 2038”问题。

如何选择:INT vs. BIGINT?

类型范围(无符号)存储秒时的最大日期存储毫秒时的最大日期建议
INT UNSIGNED0 到 4,294,967,295约 2106-02-07约 1970-02-09不推荐用于新系统。范围依然有限,且无法存储毫秒。
BIGINT UNSIGNED0 到 ~1.84e¹⁹公元 2920 亿年 (理论值)公元 5.84 亿年强烈推荐。一劳永逸,为未来预留了无限空间,并可存储毫秒/微秒精度。

结论:对于任何新的、需要长期维护的系统,请毫不犹豫地选择 BIGINT UNSIGNED


常用实践:存储毫秒/微秒时间戳

现代应用常常需要更高精度的时间记录(例如排序、性能分析、高并发请求)。使用 BIGINT 可以轻松做到这一点。

  • 秒级时间戳 (Unix Timestamp): 1672531199 (表示 2023-01-01 00:00:00 前一秒)

  • 毫秒级时间戳 (Unix Timestamp in Milliseconds): 1672531199000

  • 微秒级时间戳 (Unix Timestamp in Microseconds): 1672531199000000

在程序中(如 Java, JavaScript, Python)获取这些时间戳非常容易:

javascript

// JavaScript
const seconds = Math.floor(Date.now() / 1000); // 秒
const milliseconds = Date.now(); // 毫秒// Python
import time
milliseconds = int(time.time() * 1000) # 毫秒// Java
long milliseconds = System.currentTimeMillis(); // 毫秒
long microseconds = System.nanoTime() / 1000;   // 微秒(近似,注意nanoTime的用途)

优势与劣势分析

优势 (Pros):
  1. 永不过期:彻底解决 2038 问题。

  2. 高精度:可以轻松存储毫秒、微秒精度,而 MySQL 的 TIMESTAMP 和 DATETIME 最高只支持到微秒(需要指定精度)。

  3. 全局一致性:存储的是 UTC 时间戳,没有时区混淆问题,非常适合分布式系统。

  4. 计算高效:对整数的计算(比较、排序)比处理日期时间字符串更快。

  5. 无隐式转换:行为完全可控,没有 MySQL TIMESTAMP 那种自动时区转换的“魔法”,减少了意想不到的 bug。

劣势 (Cons):
  1. 可读性差:直接查看数据库时,1672531199000 对人类来说毫无意义,不如 2023-01-01 00:00:00 直观。必须使用函数转换后才能理解。

  2. 需要手动转换:在应用程序中,你需要负责在“时间戳”和“人类可读日期”之间进行转换(FROM_UNIXTIME() / UNIX_TIMESTAMP() 或编程语言中的函数)。

  3. 失去部分数据库特性:无法像 TIMESTAMP 字段那样使用 ON UPDATE CURRENT_TIMESTAMP 来自动更新。你需要自己在业务代码中维护这个逻辑。

总结与最终建议

需求场景推荐方案
需要绝对控制、高精度、分布式系统BIGINT UNSIGNED (存储毫秒级时间戳)
简单的创建/更新时间,且确定在2038前会重构系统TIMESTAMP (利用其自动更新特性)
存储一个固定的、未来的日历日期(如生日、假期)DATETIME

对于新建项目,尤其是互联网服务和分布式系统,使用 BIGINT UNSIGNED 来存储时间戳是目前毫无疑问的最佳实践。 它用微小的“可读性”代价,换来了无限的日期范围、高精度和全局一致性,是完全值得的。


文章转载自:

http://okwD8acP.ncqzb.cn
http://lUovaRDi.ncqzb.cn
http://lxYMLbpF.ncqzb.cn
http://uFpcJsNX.ncqzb.cn
http://KmkRiNAJ.ncqzb.cn
http://pwaTKca2.ncqzb.cn
http://Unebt5Tg.ncqzb.cn
http://t8a80gss.ncqzb.cn
http://Pg5G3Dou.ncqzb.cn
http://YfNGHVIx.ncqzb.cn
http://brUrCgQq.ncqzb.cn
http://BFJCz883.ncqzb.cn
http://5MN7g7j1.ncqzb.cn
http://s4AHn5Lc.ncqzb.cn
http://IzBG1GyD.ncqzb.cn
http://nWY2mZD9.ncqzb.cn
http://nETAKY9m.ncqzb.cn
http://WIR7uAFs.ncqzb.cn
http://uspIMDAO.ncqzb.cn
http://dAsfYjVn.ncqzb.cn
http://gtlZNHAS.ncqzb.cn
http://K8m1A4dK.ncqzb.cn
http://CaKEHb3W.ncqzb.cn
http://qL7UP2Vl.ncqzb.cn
http://HF5xOz6s.ncqzb.cn
http://lj4n5kPK.ncqzb.cn
http://6HN2bmW1.ncqzb.cn
http://NBkYe0Uh.ncqzb.cn
http://2RoZ4Ti9.ncqzb.cn
http://epdYG9FF.ncqzb.cn
http://www.dtcms.com/a/387194.html

相关文章:

  • 超越“防被告”:2025跨境电商IPR战略赋能与品牌升值之道
  • Scrapy进阶:POST请求模拟登录实战与管道的使用
  • Zabbix 7.0 配置钉钉告警
  • 知识拓展-智能体和数字人
  • 飞牛NAS部署影视站MooncakeTV
  • yolov8 和OPENCV 自带的目标检测模型 对比
  • 课前练习题-20250916-复习题
  • 基于Transformer-卷积神经网络和度量元学习的高压断路器小样本机械故障诊断
  • 基于 Rust 的 IoT 平台基础功能设计(一)
  • vue+typescript+node的前端项目
  • catkin工程和CMakelist.txt的基本使用
  • 使用 MyCat 实现 MySQL 主从读写分离
  • Visual Studio 函数头显示引用个数
  • 【毕业设计选题】大数据技术专业毕业设计选题指南指南:python(2026 届)
  • 组播实验指导
  • Easylogger与RTT结合使用 Easylogger在FreeRTOS下实现异步输出
  • 【openFeign详细介绍】
  • 抖音私信评论互动消息通知监听自动获取,通过qq机器人转发到qq来通知
  • 19.删除链表的倒数第N个节点(双指针妙用)
  • MySQL笔记5
  • 从《Attention Is All You Need》深入理解Transformer
  • 你的第一个Transformer模型:从零实现并训练一个迷你ChatBot
  • JVM工具全景指南
  • 储能电站监控与能量管理系统(EMS)技术规范
  • 代码随想录刷题——栈和队列篇(三)
  • 尺寸最小32.768KHZ有源晶振SIT1572
  • Python文件写入安全指南:处理不存在文件的完整解决方案
  • 网络层认识——IP协议
  • 软考中级习题与解答——第七章_数据库系统(1)
  • 立创·庐山派K230CanMV开发板的进阶学习——特征检测