sql >> Databáze >  >> RDS >> Mysql

PHP a mySQL:Rok 2038 Chyba:Co to je? jak to vyřešit?

Označil jsem to jako komunitní wiki, takže můžete kdykoli upravit.

V čem přesně spočívá problém roku 2038?

„Problém roku 2038 (také známý jako Unix Millennium Bug, Y2K38 analogicky k problému Y2K) může způsobit selhání některého počítačového softwaru před nebo v roce 2038. Problém se týká veškerého softwaru a systémů, které ukládají systémový čas jako podepsané 32 -bit integer a toto číslo interpretuje jako počet sekund od 00:00:00 UTC 1. ledna 1970."

Proč k tomu dochází a co se stane, když k tomu dojde?

Časy za 03:14:07 UTC v úterý 19. ledna 2038 bude „obtékat“ a bude interně uloženo jako záporné číslo, které tyto systémy budou interpretovat jako čas 13. prosince 1901 spíše než v roce 2038. To je způsobeno skutečností, že počet sekund od epochy UNIX (1. ledna 1970 00:00:00 GMT) překročí maximální hodnotu počítače pro 32bitové celé číslo se znaménkem.

Jak to vyřešíme?

  • Používejte dlouhé datové typy (64 bitů je dostačujících)
  • Pro MySQL (nebo MariaDB), pokud nepotřebujete časové informace, zvažte použití DATE typ sloupce. Pokud potřebujete vyšší přesnost, použijte DATETIME spíše než TIMESTAMP . Pozor, DATETIME sloupce neukládají informace o časovém pásmu, takže vaše aplikace bude muset vědět, které časové pásmo bylo použito.
  • Další možná řešení popsaná na Wikipedii
  • Počkejte, až vývojáři MySQL opraví tuto chybu hlášeno před více než deseti lety.

Existují nějaké možné alternativy k jeho použití, které nepředstavují podobný problém?

Všude, kde je to možné, se snažte používat velké typy pro ukládání dat v databázích:64bitové jsou dostatečné - dlouhý dlouhý typ v GNU C a POSIX/SuS nebo sprintf('%u'...) v PHP nebo rozšíření BCmath.

Jaké jsou některé potenciálně zlomové případy použití, i když ještě nejsme v roce 2038?

Takže MySQL DATETIME má rozsah 1000-9999, ale TIMESTAMP má pouze rozsah 1970-2038. Pokud váš systém ukládá data narození, budoucí budoucí data (např. hypotéky na 30 let) nebo podobné, již na tuto chybu narazíte. Opět platí, že pokud to bude problém, nepoužívejte TIMESTAMP.

Co můžeme udělat se stávajícími aplikacemi, které používají TIMESTAMP, abychom se vyhnuli takzvanému problému, když k němu skutečně dojde?

Jen málo aplikací PHP bude v roce 2038 stále existovat, i když je těžké předvídat, protože web zatím není téměř zastaralou platformou.

Zde je postup pro změnu sloupce databázové tabulky pro převod TIMESTAMP do DATETIME . Začíná vytvořením dočasného sloupce:

# 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`

Zdroje



  1. Jak vytvořit materializované pohledy na SQL Server?

  2. Vytvořte dynamický mysql dotaz pomocí php proměnných

  3. Jak mohu změnit MariaDB na MySQL v XAMPP?

  4. Jak FROM_UNIXTIME() funguje v MariaDB