나는 이것을 커뮤니티 위키로 표시 했으므로 편하게 편집 할 수 있습니다.
2038 년 문제는 정확히 무엇입니까?
"2038 년 문제 (Y2K 문제와 유사하게 Unix Millennium Bug, Y2K38라고도 함)로 인해 일부 컴퓨터 소프트웨어가 2038 년 이전 또는 2038 년에 실패 할 수 있습니다.이 문제는 시스템 시간을 서명 된 32로 저장하는 모든 소프트웨어 및 시스템에 영향을줍니다. -비트 정수이고이 숫자를 1970 년 1 월 1 일 00:00:00 UTC 이후의 초 수로 해석합니다. "
왜 발생하고 발생하면 어떻게됩니까?
2038 년 1 월 19 일 화요일 03:14:07 UTC 이후의 시간 은 ' 순환 '되어 내부적으로 음수로 저장되며, 이러한 시스템은 2038 년이 아닌 1901 년 12 월 13 일의 시간으로 해석됩니다. UNIX 시대 (1970 년 1 월 1 일 00:00:00 GMT) 이후의 시간 (초)이 32 비트 부호있는 정수에 대한 컴퓨터의 최대 값을 초과했다는 사실.
어떻게 해결합니까?
- 긴 데이터 유형 사용 (64 비트이면 충분 함)
- MySQL (또는 MariaDB)의 경우 시간 정보가 필요하지 않으면
DATE
열 유형을 사용하는 것이 좋습니다. 더 높은 정확도가 필요한 DATETIME
경우 TIMESTAMP
. 조심하십시오 DATETIME
응용 프로그램이 사용 된 시간대 알고 있어야합니다, 그래서 열이 시간대에 대한 정보를 저장하지 않습니다.
- Wikipedia에 설명 된 다른 가능한 솔루션
- MySQL 개발자가 10 년 전에보고 된 이 버그 를 수정할 때까지 기다리십시오 .
비슷한 문제를 일으키지 않는 사용에 대한 가능한 대안이 있습니까?
데이터베이스에 날짜를 저장하기 위해 가능한 한 큰 유형을 사용하도록 시도하십시오. 64 비트이면 충분합니다. GNU C 및 POSIX / SuS 또는 sprintf('%u'...)
PHP 또는 BCmath 확장 의 long long 유형입니다 .
아직 2038 년이 아니지만 잠재적으로 파괴되는 사용 사례에는 어떤 것이 있습니까?
따라서 MySQL DATETIME 의 범위는 1000-9999이지만 TIMESTAMP의 범위는 1970-2038입니다. 시스템에 생년월일, 미래의 미래 날짜 (예 : 30 년 모기지) 또는 이와 유사한 정보가 저장되어 있으면 이미이 버그가 발생합니다. 다시 말하지만 이것이 문제가 될 경우 TIMESTAMP를 사용하지 마십시오.
TIMESTAMP를 사용하는 기존 애플리케이션에 대해 소위 문제가 실제로 발생하는 것을 방지하기 위해 무엇을 할 수 있습니까?
웹이 아직 레거시 플랫폼이 아니기 때문에 예측하기는 어렵지만 2038 년에는 PHP 애플리케이션이 거의 없을 것입니다.
다음은 변환 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`
자원