代码之家  ›  专栏  ›  技术社区  ›  O. Jones

如何选择能够适应2038年滚动的MySQL列数据类型?

  •  1
  • O. Jones  · 技术社区  · 7 年前

    2038年1月19日03:14:07格林威治标准时间现在离我们不到20年了。这就是UNIX的32位时间戳的滚动时间。我正在设计一些MySQL表,这些表当时可能仍在使用。

    这就是所谓的 2038年 问题

    看起来,从我在MariaDB 10.3上尝试的东西来看,使用 TIMESTAMP 数据类型在日期滚动后为日期戳生成错误1292(不正确的日期时间值)。

    将这些表格设计成可供未来使用的良好实践是什么?我可以用 DATETIME 数据,但是 时间戳 在时区方面有一些非常有用的特性。

    MySQL的未来版本(更不用说Linux和其他UNIX衍生产品)有可能升级吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   JaneDoe    7 年前

    使用BigInts存储unix时间戳。这在功能上等同于时间戳类型,尽管缺少一些与之相连的糖。然而,如果在应用程序级别,您乐于使用UNIX时间戳,那么这一点都没有区别,至少到目前为止,对于我来说,在数据库层偶尔使用UNIX_TIMESTAMP()/FROM_UNIXTIME()调用来处理这一问题是微不足道的。这将使你在2038年之后继续前进。

    尽管我预计MySQL/Maria mob会在X.y版本中创建一些黑客攻击,作为升级路径的一部分自动更新时间戳字段。请注意,它可能会在2038年1月18日发布

    无论如何,如果你想证明未来,BIGINT作为UNIX时间戳是你的答案。

        2
  •  0
  •   Rick James diyism    7 年前

    拿出你在1998年写的代码。找一台机器来运行它。您可能需要找到一个软盘驱动器来加载它。

    现在,问问自己“20年后代码和硬件会发生什么”?

    我建议,除了政府合同之外,2018年编写的所有代码都将在2038年之前被扔进垃圾桶。

    1998年,MySQL运行的是版本3。xx;我不想用一个10年(或20年)的杆子来碰它。从那时起,内部格式 DATETIME 改变了, CHARACTER SETs 添加了很多优化,添加了子查询,修复了bug等等。

    我在最后一段中的观点是,无论你今天写什么,都会经历痛苦 应用 随着MySQL在未来20年的成熟而变化。解决2038年的问题只是众多变化之一。

        3
  •  0
  •   theking2    5 年前

    使用这两个函数并将时间戳存储为十进制

    CREATE FUNCTION from_unixtime_fixed (v DECIMAL(16,6))
        RETURNS DATETIME(6) DETERMINISTIC
        RETURN DATE_ADD(FROM_UNIXTIME(0), INTERVAL v second);
    CREATE FUNCTION unix_timestamp_fixed (v DATETIME(6))
        RETURNS DECIMAL(16,6) DETERMINISTIC
        RETURN TIMESTAMPDIFF(SECOND, FROM_UNIXTIME(0), v);
    

    示例用法: 选择unix_时间戳_fixed('2039-01-01');

    返回217749200.000000

    select from_unixtime_fixed(2177449200.100000);
    

    返回2039-01-01 00:00:00.100000

    如果您对毫秒不感兴趣,请将小数点(16,6)减少为小数点(16,0)