sql >> Base de Datos >  >> RDS >> Mysql

PHP &mySQL:Error del año 2038:¿Qué es? ¿Cómo resolverlo?

He marcado esto como un wiki de la comunidad, así que siéntete libre de editarlo cuando quieras.

¿Qué es exactamente el problema del año 2038?

"El problema del año 2038 (también conocido como error del milenio de Unix, Y2K38 por analogía con el problema Y2K) puede causar que algún software de computadora falle antes o en el año 2038. El problema afecta a todo el software y los sistemas que almacenan la hora del sistema como un 32 firmado. -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?

Horas posteriores a las 03:14:07 UTC del martes 19 de enero de 2038 se 'envolverá' y se almacenará 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 al hecho de que la cantidad de segundos desde la época de UNIX (1 de enero 1970 00:00:00 GMT) habrá excedido el valor máximo de una computadora para un entero con signo de 32 bits.

¿Cómo lo solucionamos?

  • Utilice tipos de datos largos (64 bits es suficiente)
  • Para MySQL (o MariaDB), si no necesita la información de tiempo, considere usar DATE tipo de columna Si necesita mayor precisión, use DATETIME en lugar de TIMESTAMP . Cuidado con que DATETIME Las columnas no almacenan información sobre la zona horaria, por lo que su aplicación deberá saber qué zona horaria se utilizó.
  • Otras posibles soluciones descritas en Wikipedia
  • Espere a que los desarrolladores de MySQL corrijan este error informado hace más de una década.

¿Existen posibles alternativas a su uso que no planteen un problema similar?

Siempre que sea posible, intente usar 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 estamos en 2038?

Entonces un MySQL DATETIME 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 de prever ya que la web aún no es una plataforma heredada.

Aquí hay un proceso para modificar una columna de la tabla de la 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