Eu marquei este como um wiki da comunidade, então fique à vontade para editar quando quiser.
Qual é exatamente o problema do ano 2038?
"O problema do ano 2038 (também conhecido como Bug Unix Millennium, Y2K38 por analogia ao problema Y2K) pode fazer com que alguns softwares de computador falhem antes ou no ano de 2038. O problema afeta todos os softwares e sistemas que armazenam a hora do sistema como um 32 assinado -bit inteiro, e interpretar esse número como o número de segundos desde 00:00:00 UTC em 1º de janeiro de 1970. "
Por que isso ocorre e o que acontece quando ocorre?
Vezes além de 03:14:07 UTC na terça-feira, 19 de janeiro de 2038 serão ' agrupados ' e armazenados internamente como um número negativo, que esses sistemas interpretarão como um tempo em 13 de dezembro de 1901 em vez de 2038. Isso se deve a o fato de que o número de segundos desde a época do UNIX (1 de janeiro de 1970 00:00:00 GMT) terá excedido o valor máximo de um computador para um inteiro assinado de 32 bits.
Como resolvemos isso?
- Use tipos de dados longos (64 bits são suficientes)
- Para MySQL (ou MariaDB), se você não precisa das informações de tempo, considere usar o
DATE
tipo de coluna. Se precisar de maior precisão, use em DATETIME
vez de TIMESTAMP
. Esteja ciente de que as DATETIME
colunas não armazenam informações sobre o fuso horário, portanto, seu aplicativo terá que saber qual fuso horário foi usado.
- Outras soluções possíveis descritas na Wikipedia
- Espere que os desenvolvedores do MySQL consertem esse bug relatado há mais de uma década.
Existem alternativas possíveis para usá-lo, que não representam um problema semelhante?
Sempre que possível, tente usar tipos grandes para armazenar datas em bancos de dados: 64 bits é suficiente - um tipo longo e longo em GNU C e POSIX / SuS, ou sprintf('%u'...)
em PHP ou na extensão BCmath.
Quais são alguns casos de uso potencialmente prejudiciais, embora ainda não estejamos em 2038?
Portanto, um MySQL DATETIME tem um intervalo de 1000-9999, mas TIMESTAMP só tem um intervalo de 1970-2038. Se o seu sistema armazena datas de nascimento, datas futuras de encaminhamento (por exemplo, hipotecas de 30 anos) ou algo semelhante, você já encontrará esse bug. Novamente, não use TIMESTAMP se isso for um problema.
O que podemos fazer com os aplicativos existentes que utilizam o TIMESTAMP, para evitar o chamado problema, quando ele realmente ocorre?
Poucos aplicativos PHP ainda estarão por aí em 2038, embora seja difícil prever, já que a web ainda não é uma plataforma legada.
Aqui está um processo para alterar uma coluna da tabela de banco de dados para converter TIMESTAMP
para DATETIME
. Tudo começa com a criação de uma coluna temporária:
# 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