He marcado esto como un wiki de la comunidad, así que siéntete libre de editarlo cuando quieras.
¿Cuál es exactamente el problema del año 2038?
"El problema del año 2038 (también conocido como Unix Millennium Bug, Y2K38 por analogía con el problema Y2K) puede hacer que algunos programas de computadora fallen antes o en el año 2038. El problema afecta a todos los programas y sistemas que almacenan la hora del sistema como un 32 -bit entero e interprete este número como el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970 ".
¿Por qué ocurre y qué sucede cuando ocurre?
Las horas posteriores a las 03:14:07 UTC del martes 19 de enero de 2038 se 'envolverán' y se almacenarán internamente como un número negativo, que estos sistemas interpretarán como una hora del 13 de diciembre de 1901 en lugar de 2038. Esto se debe a el hecho de que el número de segundos desde la época de UNIX (1 de enero de 1970 00:00:00 GMT) habrá excedido el valor máximo de una computadora para un entero de 32 bits con signo.
¿Como lo resolvemos?
- Utilice tipos de datos largos (64 bits es suficiente)
- Para MySQL (o MariaDB), si no necesita la información de tiempo, considere usar el
DATE
tipo de columna. Si necesita una mayor precisión, utilice en DATETIME
lugar de TIMESTAMP
. Tenga en cuenta que las DATETIME
columnas no almacenan información sobre la zona horaria, por lo que su aplicación tendrá que saber qué zona horaria se utilizó.
- Otras posibles soluciones descritas en Wikipedia
- Espere a que los desarrolladores de MySQL solucionen este error informado hace más de una década.
¿Existen posibles alternativas a su uso que no planteen un problema similar?
Intente siempre que sea posible utilizar tipos grandes para almacenar fechas en bases de datos: 64 bits es suficiente: un tipo largo y largo en GNU C y POSIX / SuS, o sprintf('%u'...)
en PHP o la extensión BCmath.
¿Cuáles son algunos casos de uso potencialmente innovadores aunque todavía no estemos en 2038?
Entonces, un DATETIME de MySQL tiene un rango de 1000-9999, pero TIMESTAMP solo tiene un rango de 1970-2038. Si su sistema almacena fechas de nacimiento, fechas futuras (por ejemplo, hipotecas a 30 años) o similares, ya se encontrará con este error. Nuevamente, no use TIMESTAMP si esto va a ser un problema.
¿Qué podemos hacer con las aplicaciones existentes que usan TIMESTAMP, para evitar el llamado problema, cuando realmente ocurre?
Pocas aplicaciones PHP seguirán existiendo en 2038, aunque es difícil prever ya que la web no es una plataforma heredada todavía.
Aquí es un proceso para modificar una columna de tabla de base de datos para convertir TIMESTAMP
a DATETIME
. Comienza con la creación de una columna temporal:
# 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`
Recursos