PHP 和 mySQL:2038 年错误:这是什么?怎么解决呢?

2024-01-29

我正在考虑使用 TIMESTAMP 来存储日期+时间,但我读到它有 2038 年的限制。我不喜欢批量提出问题,而是更愿意将其分成小部分,以便新手用户也很容易理解。所以我的问题是:

  1. 2038年问题到底是什么?
  2. 为什么会发生以及发生时会发生什么?
  3. 我们该如何解决呢?
  4. 是否有任何可能的替代方案可以使用它,而不会造成类似的问题?
  5. 当问题真正发生时,我们可以对使用 TIMESTAMP 的现有应用程序做些什么来避免所谓的问题?

我已将其标记为社区 wiki,因此您可以在闲暇时随意编辑。

2038年问题到底是什么?

“2038 年问题(也称为 Unix Millennium Bug,Y2K38,类似于 Y2K 问题)可能会导致某些计算机软件在 2038 年之前或之内出现故障。该问题会影响所有将系统时间存储为带符号的 32 位时间的软件和系统。位整数,并将该数字解释为自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。”


为什么会发生以及发生时会发生什么?

超越时代2038 年 1 月 19 日星期二 03:14:07 UTC将“环绕”并在内部存储为负数,这些系统会将其解释为 1901 年 12 月 13 日而不是 2038 年的时间。这是因为自 UNIX 纪元(1 月 1 日)以来的秒数1970 00:00:00 GMT)将超过计算机 32 位有符号整数的最大值。


我们该如何解决呢?

  • 使用长数据类型(64 位就足够了)
  • 对于 MySQL(或 MariaDB),如果您不需要时间信息,请考虑使用DATE列类型。如果您需要更高的精度,请使用DATETIME而不是TIMESTAMP。当心DATETIME列不存储有关时区的信息,因此您的应用程序必须知道使用了哪个时区。
  • 维基百科上描述的其他可能的解决方案 http://en.wikipedia.org/wiki/Year_2038_problem#Solutions
  • 将您的 Mysql 升级到8.0.28 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-28.html#mysqld-8-0-28-feature或更高

是否有任何可能的替代方案可以使用它,而不会造成类似的问题?

尽可能尝试使用大类型在数据库中存储日期:64 位就足够了 - GNU C 和 POSIX/SuS 中的 long long 类型,或者sprintf('%u'...)在 PHP 或 BCmath 扩展中。


尽管我们还没有到 2038 年,但有哪些潜在的破坏性用例?

那么一个MySQLDATETIME http://dev.mysql.com/doc/refman/5.6/en/datetime.htmlTIMESTAMP 的范围是 1000-9999,而 TIMESTAMP 的范围是 1970-2038。如果您的系统存储生日、未来的远期日期(例如 30 年抵押贷款)或类似信息,那么您已经会遇到此错误。再次强调,如果这会成为问题,请不要使用 TIMESTAMP。


当问题真正发生时,我们可以对使用 TIMESTAMP 的现有应用程序做些什么来避免所谓的问题?

到 2038 年,几乎没有 PHP 应用程序仍然存在,尽管很难预见,因为 Web 还很难成为一个遗留平台。

这是更改数据库表列以进行转换的过程TIMESTAMP to DATETIME。首先创建一个临时列:

# rename the old TIMESTAMP field
ALTER TABLE `myTable` CHANGE `myTimestamp` `temp_myTimestamp` int(11) NOT NULL;

# create a new DATETIME column of the same name as your old column
ALTER TABLE `myTable` ADD `myTimestamp` DATETIME NOT NULL;

# update all rows by populating your new DATETIME field
UPDATE `myTable` SET `myTimestamp` = FROM_UNIXTIME(temp_myTimestamp);

# remove the temporary column
ALTER TABLE `myTable` DROP `temp_myTimestamp`

资源

  • 2038 年问题(维基百科) http://en.wikipedia.org/wiki/Year_2038_problem
  • 互联网将在 30 年内终结 http://readwrite.com/2008/03/13/the_internet_will_end_in_30_years/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 和 mySQL:2038 年错误:这是什么?怎么解决呢? 的相关文章

  • 单元测试魔术方法

    当涉及到 PHP 中魔术方法的单元测试实现时 调用这些方法的推荐方法是什么 我看到三个可用选项 显式 直接调用它们 object gt get someValue 间接调用它们 使用任何旨在触发它们的操作 object gt someVal
  • PHP:调用另一个类的方法

    我仍在学习 OOP 所以这甚至可能是不可能的 尽管如果是这样我会感到惊讶 我需要一些帮助来调用另一个类方法 例如在ClassA I有这个方法 function getName return this gt name 现在从ClassB 不同
  • 如何 POST 从 PHP 创建的 HTML 表数据

    while row mysql fetch array res echo tr echo td td tr
  • PDO::bindValue() 在使用嵌套 SELECT 进行查询时失败

    我正在使用通过 ODBC 连接的 MSSQL 数据库 使用时PDO bindValue 在具有嵌套 SELECT 语句的查询上 它无法绑定嵌套 SELECT 中的值 在主 SELECT 上没有问题 这是一段失败的示例代码 stmt cmdb
  • Laravel Eloquent 更新(如果已进行更改)

    如果记录发生更改 是否有任何方法可以使用 eloquent 模型更新 Laravel 中的记录 我不希望任何用户无缘无故地一遍又一遍地请求数据库 只需点击按钮即可保存更改 我有一个javascript根据页面中是否发生更改来启用和禁用保存按
  • “?”附近的 MySQLSyntaxErrorException当尝试执行PreparedStatement时

    我正在尝试使用Java 中的PreparedStatement 执行查询 当我尝试执行查询时 收到错误号 1064 语法错误 我已经在 MySQL 查询浏览器中使用替换值对此进行了测试 效果很好 我的代码有什么问题吗 这是相关代码 Stri
  • PHP Web 应用程序中的 Ace 编辑器

    我正在制作一个小型网络应用程序 允许用户通过以下方式提交 html css 和 javascript 内容王牌编辑器 http ace ajax org 在此编辑器中 将存储的内容回显到编辑器中就足够了 但是无论如何我找不到将用户输入提交到
  • Laravel 5.1 用户、角色和操作

    我正在使用 Laravel 5 1 创建一个应用程序users roles and actions 表设置如下 user id name 1 John Smith 2 Fred Smith role id name 1 Administra
  • 使用 HybridAuth 登录 Facebook 显示错误 您无法直接访问此页面

    我正在尝试为我的网站编写一个插件 以使用 HybridAuth 与 facebook 连接 类 我刚刚尝试了以下代码 function authenticatewith provider ini set display errors on
  • Woocommerce:添加第二个电子邮件地址不起作用,除非收件人是管理员

    我尝试了多种方法来向 Woocommerce 电子邮件添加其他收件人 但它似乎仅适用于主要收件人是管理员的测试订单 这些是我尝试过的片段 如果订单的客户是管理员 则电子邮件将发送到这两个地址 如果订单包含客户电子邮件地址 则仅发送至该电子邮
  • 如何在 Laravel 中将秒转换为天小时分钟[重复]

    这个问题在这里已经有答案了 我想将以秒为单位的时间间隔转换为天小时分钟 我已经尝试过了 value 90060 CarbonInterval seconds value gt forHumans 我得到了输出 90060 seconds 我
  • MySQL 匹配全文

    我正在尝试使用 mysql 进行全文搜索以匹配字符串 问题是它首先返回奇怪的结果 例如 字符串 passat 2 0 tdi AND MATCH records veiculos titulo records veiculos descri
  • Mysql启动问题|错误!服务器退出而不更新PID文件

    有任何想法吗 Joshs MacBook Pro cdwhp joshc mysql server start Starting MySQL ERROR The server quit without updating PID file u
  • 使用 JWT Laravel 5 进行身份验证,无需密码

    我正在尝试学习 Laravel 我的目标是能够构建一个 RESTful API 不使用视图或刀片 仅使用 JSON 结果 稍后 AngularJS Web 应用程序和 Cordova 混合移动应用程序将使用此 api 经过一番研究 我倾向于
  • PHP 会话不会在每个请求上延长 Cookie 过期时间

    session start 是否应该通过 session gc maxlifetime 变量来延长会话 ID cookie 的寿命 我的 session gc maxlifetime 是 24 分钟 每个会话仅存活 24 分钟 无论网站上有
  • 正则表达式 - 从字符串末尾搜索

    我如何从字符串末尾定位某些内容 complexthing 50 other 50 MORE 50 我想以 50 结尾 但是这个 复杂的东西 可以以 结尾 所以在这种情况下 我不能在 处打断 因为乞求可能会让它感到困惑 所以对我来说最简单的正
  • Mysql 更快的 INSERT

    好的 我有大约 175k 个 INSERT 语句 相当大的 INSERT 语句 例如 INSERT INTO gast ID Identiteitskaartnummer Naam Voornaam Adres Postcode Stad
  • 如何使用 PHP 解释 HTML5 输入日期值

    我需要让用户选择一个日期 最好采用 dd mm yy 格式 我决定尝试新的 HTML5 输入日期类型 但是我不知道如何解释它在服务器端给出的值 我得到的值是 yyyy mm dd 我怎样才能做到这一点 如果用户使用不支持它的旧版浏览器怎么办
  • Paypal Rest API - 来自批准 URL 的令牌生命周期

    我使用 Paypal Rest API 我的问题是 有多长token来自批准 URL 有效吗 我想将此令牌 也包含我的令牌 存储到数据库并生成带有我的令牌的链接 稍后 如果我单击此链接 将我的令牌替换为 paypal 令牌 我想重定向到 p
  • 无法通过 ssh 访问服务器下载 Composer - 1and1

    我可以通过 SSH 访问我的 1and1 服务器 我正在尝试下载作曲家 遵循来自的指示http getcomposer org download http getcomposer org download 尝试1 user gt curl

随机推荐