Oznaczyłem to jako wiki społeczności, więc możesz edytować w wolnym czasie.
Na czym dokładnie polega problem roku 2038?
„Problem z roku 2038 (znany również jako Unix Millennium Bug, Y2K38 przez analogię do problemu Y2K) może spowodować awarię niektórych programów komputerowych przed rokiem 2038 lub w tym roku. Problem dotyczy wszystkich programów i systemów przechowujących czas systemowy jako podpisany 32 -bitowa liczba całkowita i interpretuje tę liczbę jako liczbę sekund od godziny 00:00:00 czasu UTC 1 stycznia 1970 r. "
Dlaczego tak się dzieje i co się dzieje, gdy się pojawia?
Czasy poza godziną 03:14:07 czasu UTC we wtorek, 19 stycznia 2038 r. Będą „zawijać się” i przechowywane wewnętrznie jako liczba ujemna, którą systemy te będą interpretować jako czas z 13 grudnia 1901 r., A nie z 2038 r. Wynika to z fakt, że liczba sekund od epoki UNIX (1 stycznia 1970 00:00:00 GMT) przekroczy maksymalną wartość komputera dla 32-bitowej liczby całkowitej ze znakiem.
Jak to rozwiązujemy?
- Używaj długich typów danych (wystarczy 64 bity)
- W przypadku MySQL (lub MariaDB), jeśli nie potrzebujesz informacji o czasie, rozważ użycie
DATE
typu kolumny. Jeśli potrzebujesz większej dokładności, użyj DATETIME
zamiast TIMESTAMP
. Pamiętaj, że DATETIME
kolumny nie przechowują informacji o strefie czasowej, więc Twoja aplikacja będzie musiała wiedzieć, która strefa czasowa była używana.
- Inne Możliwe rozwiązania opisane w Wikipedii
- Poczekaj, aż deweloperzy MySQL naprawią ten błąd zgłoszony ponad dekadę temu.
Czy są jakieś alternatywne rozwiązania, które nie stwarzają podobnego problemu?
W miarę możliwości staraj się używać dużych typów do przechowywania dat w bazach danych: wystarczy 64-bity - długi typ w GNU C i POSIX / SuS lub sprintf('%u'...)
w PHP lub rozszerzeniu BCmath.
Jakie są potencjalnie psujące przypadki użycia, mimo że nie jesteśmy jeszcze w 2038 roku?
Tak więc MySQL DATETIME ma zakres 1000-9999, ale TIMESTAMP ma tylko zakres 1970-2038. Jeśli Twój system przechowuje daty urodzenia, przyszłe daty przyszłe (np. 30-letnie kredyty hipoteczne) lub podobne, już napotkasz ten błąd. Ponownie, nie używaj TIMESTAMP, jeśli może to stanowić problem.
Co możemy zrobić z istniejącymi aplikacjami, które używają TIMESTAMP, aby uniknąć tak zwanego problemu, kiedy on naprawdę wystąpi?
Niewiele aplikacji PHP będzie nadal dostępnych w 2038 r., Choć trudno to przewidzieć, ponieważ internet nie jest jeszcze starszą platformą.
Oto proces zmieniania kolumny tabeli bazy danych do konwersji TIMESTAMP
do DATETIME
. Zaczyna się od utworzenia tymczasowej kolumny:
# 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`
Zasoby