Ich habe dies als Community-Wiki markiert. Sie können es also nach Belieben bearbeiten.
Was genau ist das Problem des Jahres 2038?
"Das Problem des Jahres 2038 (analog zum Y2K-Problem auch als Unix Millennium Bug, Y2K38 bekannt) kann dazu führen, dass einige Computersoftware vor oder im Jahr 2038 ausfällt. Das Problem betrifft alle Software und Systeme, in denen die Systemzeit als signierte 32 gespeichert ist -bit Ganzzahl, und interpretieren Sie diese Zahl als die Anzahl der Sekunden seit 00:00:00 UTC am 1. Januar 1970. "
Warum tritt es auf und was passiert, wenn es auftritt?
Zeiten jenseits 03:14:07 UTC am Dienstag, 19. Januar 2038, werden " umlaufen " und intern als negative Zahl gespeichert, die diese Systeme als Zeit am 13. Dezember 1901 und nicht im Jahr 2038 interpretieren. Dies ist darauf zurückzuführen Die Tatsache, dass die Anzahl der Sekunden seit der UNIX-Epoche (1. Januar 1970, 00:00:00 GMT) den Maximalwert eines Computers für eine 32-Bit-Ganzzahl mit Vorzeichen überschritten hat.
Wie lösen wir das?
- Verwenden Sie lange Datentypen (64 Bit sind ausreichend)
- Wenn Sie für MySQL (oder MariaDB) keine Zeitinformationen benötigen, sollten Sie den
DATE
Spaltentyp verwenden. Wenn Sie eine höhere Genauigkeit benötigen, verwenden Sie DATETIME
statt TIMESTAMP
. Beachten Sie, dass in DATETIME
Spalten keine Informationen zur Zeitzone gespeichert werden, sodass Ihre Anwendung wissen muss, welche Zeitzone verwendet wurde.
- Andere mögliche Lösungen auf Wikipedia beschrieben
- Warten Sie, bis MySQL-Entwickler diesen vor über einem Jahrzehnt gemeldeten Fehler behoben haben.
Gibt es mögliche Alternativen zur Verwendung, die kein ähnliches Problem darstellen?
Versuchen Sie nach Möglichkeit, große Typen zum Speichern von Daten in Datenbanken zu verwenden: 64-Bit ist ausreichend - ein langer langer Typ in GNU C und POSIX / SuS oder sprintf('%u'...)
in PHP oder der BCmath-Erweiterung.
Was sind einige potenziell brechende Anwendungsfälle, obwohl wir noch nicht im Jahr 2038 sind?
Ein MySQL DATETIME hat also einen Bereich von 1000-9999, aber TIMESTAMP hat nur einen Bereich von 1970-2038. Wenn Ihr System Geburtsdaten, zukünftige Termine (z. B. 30-jährige Hypotheken) oder ähnliches speichert, wird dieser Fehler bereits auftreten. Verwenden Sie auch hier nicht TIMESTAMP, wenn dies ein Problem darstellen soll.
Was können wir mit den vorhandenen Anwendungen tun, die TIMESTAMP verwenden, um das sogenannte Problem zu vermeiden, wenn es tatsächlich auftritt?
Im Jahr 2038 werden es nur noch wenige PHP-Anwendungen geben, obwohl dies schwer vorhersehbar ist, da das Web noch kaum eine Legacy-Plattform ist.
Hier ist ein Prozess zum Ändern einer Datenbanktabellenspalte, in die konvertiert werden TIMESTAMP
soll DATETIME
. Es beginnt mit dem Erstellen einer temporären Spalte:
# 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`
Ressourcen