Dev*_*ner 99 php mysql year2038
我正在考虑使用TIMESTAMP存储日期+时间,但我读到它有2038年的限制.我没有大量提出我的问题,而是倾向于将其分解成小部分,以便新手用户也能轻松理解.所以我的问题:
提前致谢.
Cor*_*lou 132
我已将此标记为社区维基,因此您可以随意编辑.
"2038年的问题(也称为Unix Millennium Bug,Y2K38类似于Y2K问题)可能会导致某些计算机软件在2038年之前或之后失败.该问题影响所有将系统时间存储为签名的软件和系统32 -bit integer,并将此数字解释为1970年1月1日00:00:00 UTC以来的秒数."
超越时代3时14分07秒UTC在星期二,2038 1月19日将"环绕"并为负数,这些系统将在1901年12月13日,解释为一个时间,而不是在2038年内部存储这是由于事实上,自UNIX纪元(1970年1月1日00:00:00 GMT)以来的秒数将超过计算机32位有符号整数的最大值.
DATE
列类型.如果您需要更高的准确度,请使用DATETIME
而不是TIMESTAMP
.请注意,DATETIME
列不存储有关时区的信息,因此您的应用程序必须知道使用了哪个时区.尽可能尝试使用大型类型在数据库中存储日期:64位就足够了 - GNU C和POSIX/SuS中的long long类型,或sprintf('%u'...)
PHP或BCmath扩展中的long long类型.
因此,MySQL DATETIME的范围为1000-9999,但TIMESTAMP的范围仅为1970-2038.如果您的系统存储了生日,未来的转发日期(例如30年抵押贷款)或类似情况,那么您已经遇到了这个错误.同样,如果这是一个问题,请不要使用TIMESTAMP.
很少有PHP应用程序在2038年仍然存在,但很难预见,因为网络还不是传统平台.
以下是更改要转换TIMESTAMP
为的数据库表列的过程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`
Run Code Online (Sandbox Code Playgroud)
资源
Pas*_*TIN 12
使用UNIX时间戳存储日期时,实际上使用的是32位整数,它保留自1970-01-01以来的秒数; 看Unix时间
这个32位数将在2038年溢出.这就是2038年的问题.
要解决该问题,您不能使用32位UNIX时间戳来存储日期 - 这意味着,在使用MySQL时,您不应该使用TIMESTAMP
,但是DATETIME
(参见10.3.1.DATETIME,DATE和TIMESTAMP类型):
DATETIME
当您需要包含日期和时间信息的值时,将使用该类型.支持的范围是'1000-01-01 00:00:00'
到'9999-12-31 23:59:59'
.该
TIMESTAMP
数据类型的范围为'1970-01-01 00:00:01'
UTC到'2038-01-19 03:14:07'
UTC.
您可以对应用程序执行以避免/修复该问题
的(可能)最好的事情是不使用TIMESTAMP
,但DATETIME
对于必须包含不在1970年和2038年之间的日期的列.
但是有一个小小的说明:从2038年开始,你的应用程序可能已被重写了很多次(从统计学上来说)非常高^ ^所以也许,如果你不需要在未来处理日期,您不必在当前版本的应用程序中处理该问题...
归档时间: |
|
查看次数: |
33540 次 |
最近记录: |