当前位置: 首页 > 知识库问答 >
问题:

mysql - MySQL timestamp 2038 年限制解决方案?

锺离飞鸣
2024-04-30

MySQL timestamp 到2038如何解决

目前MySQL版本8.0.29,尝试了改sql_mode但是没有效果,只能把字段改为datetime吗
image.png

MySQL升级到了8.0.36,设置了sql_mode,新建了一张表设置日期超过2038还是不行
image.png
image.png

共有2个答案

魏安宁
2024-04-30

升级后配置也不行,最后还是改表了,这里补充一个批量改表方式,执行下面查询sql,得到的sql语句复制出来然后执行就行了。

改表需谨慎,请在测试数据库测试没问题再操作!改表需谨慎,请在测试数据库测试没问题再操作!改表需谨慎,请在测试数据库测试没问题再操作!

SELECT CONCAT(    'ALTER TABLE `', t.TABLE_NAME, '` MODIFY `',t. COLUMN_NAME, '` DATETIME COMMENT ''',    IFNULL(t.column_comment, ''),    ''';') AS alter_statementFROM (    SELECT TABLE_NAME, COLUMN_NAME    FROM information_schema.COLUMNS    WHERE TABLE_SCHEMA = 'your_table'    AND COLUMN_TYPE LIKE '%timestamp%') AS colsLEFT JOIN (    SELECT TABLE_NAME, COLUMN_NAME, COLUMN_COMMENT    FROM information_schema.COLUMNS    WHERE TABLE_SCHEMA = 'your_table'    AND COLUMN_COMMENT IS NOT NULL) AS tON cols.TABLE_NAME = t.TABLE_NAME AND cols.COLUMN_NAME = t.COLUMN_NAMEWHERE t.TABLE_NAME IS NOT NULL;
经国安
2024-04-30

MySQL 的 TIMESTAMP 数据类型在存储时间戳时有一个已知的限制,这是由于其底层表示是基于 Unix 时间戳的 32 位整数。Unix 时间戳从 1970 年 1 月 1 日开始计算,以秒为单位,由于它是 32 位的,因此它只能表示到 2038 年 1 月 19 日 03:14:07 UTC 的时间范围。一旦超过这个时间点,TIMESTAMP 数据类型可能会遇到溢出问题。

对于 MySQL 8.0.29 版本,解决这个限制的方法有几种:

  1. 使用 DATETIME 数据类型
    如果你不需要考虑时区变化,或者你的应用程序可以处理时区转换,那么将字段类型从 TIMESTAMP 改为 DATETIME 是一个简单直接的解决方案。DATETIME 类型可以表示从 1000-01-01 00:00:00 到 9999-12-31 23:59:59 的日期和时间范围。

    示例:

    ALTER TABLE your_table_name MODIFY your_timestamp_column_name DATETIME;
  2. 使用 BIGINT 和 UNIX 时间戳
    如果你需要更高的时间精度或超过 DATETIME 范围的时间戳,你可以使用 BIGINT 数据类型来存储 Unix 时间戳(以毫秒或微秒为单位)。这样,你可以存储从 1970 年 1 月 1 日至今的任意时间,并且能够扩展到未来很长的时间。

    示例:

    ALTER TABLE your_table_name MODIFY your_timestamp_column_name BIGINT UNSIGNED;

    在应用程序中,你可以使用相应的函数来将 BIGINT 类型的 Unix 时间戳转换为人类可读的日期和时间格式。

  3. 升级 MySQL 版本
    虽然 MySQL 8.0.29 版本仍然受到这个限制,但未来的 MySQL 版本可能会提供对 TIMESTAMP 数据类型的改进或新的数据类型来支持更广泛的日期范围。检查 MySQL 的官方文档和更新日志,以了解是否有关于此问题的最新进展。
  4. 避免使用 TIMESTAMP
    如果你不需要 MySQL 自动更新 TIMESTAMP 字段的功能(例如,在每次行更新时自动更新最后一个修改时间),则可以避免使用 TIMESTAMP 数据类型,并使用上述提到的 DATETIME 或 BIGINT 类型来替代。

请注意,更改列的数据类型可能会影响现有的应用程序代码和查询,因此在进行更改之前,请确保你了解这些更改的影响,并在生产环境中进行充分的测试。

 类似资料:
  • 问题内容: 在启动时,我正在为我们的数据库考虑扩展解决方案。MySQL至少使我感到困惑(至少对我而言),MySQL具有MySQL群集,复制和MySQL群集复制(来自5.1.6版),它是MySQL群集的异步版本。MySQL手册解释了其集群FAQ中的一些差异,但是很难确定何时使用它们中的一个。 我将不胜感激那些熟悉这些解决方案之间的区别以及优点和缺点以及何时建议使用每种解决方案的人的任何建议。 问题答

  • 本文向大家介绍CentOS 7中MySQL连接数被限制为214个的解决方法,包括了CentOS 7中MySQL连接数被限制为214个的解决方法的使用技巧和注意事项,需要的朋友参考一下 发现问题 最近在项目中遇到一个问题,由于连接数过多,提示 “Too many connections” ,需要增加连接数。 我在 /etc/my.cnf中修改了: 但是, 实际连接数一直被限制在 214: 思考 如果

  • 本文向大家介绍详解MySQL双活同步复制四种解决方案,包括了详解MySQL双活同步复制四种解决方案的使用技巧和注意事项,需要的朋友参考一下 对于数据实时同步,其核心是需要基于日志来实现,是可以实现准实时的数据同步,基于日志实现不会要求数据库本身在设计和实现中带来任何额外的约束。 基于MySQL原生复制主主同步方案  这是常见的方案,一般来说,中小型规模的时候,采用这种架构是最省事的。 两个节点可以

  • 视听年龄限制 部分内容(游戏或影像等)可能预先内建了视听限制。设定PSP™主机的视听年龄限制,可限制PSP™不得播放超过该限制等级的内容。除[关]外,PSP™主机共可设定为11种等级。 关 解除视听年龄限制 11~1 设定视听年龄限制的数字等级。数字愈小代表视听愈受局限。 随着PSP™主机和内容之视听年龄限制的组合,将决定可否播放。两者间的组合如下表。 范例:PSP™的视听年龄限制设定为[9]时,

  • 本文向大家介绍MySQL高可用解决方案MMM(mysql多主复制管理器),包括了MySQL高可用解决方案MMM(mysql多主复制管理器)的使用技巧和注意事项,需要的朋友参考一下 一、MMM简介: MMM即Multi-Master Replication Manager for MySQL:mysql多主复制管理器,基于perl实现,关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚

  • 问题内容: 我正在从Java Collection Framework寻找一个不允许使用null元素的类。 你认识一个吗 问题答案: 大多数实现(值得注意的例外)不接受。 是一种不允许值的专用实现。