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

Laravel SQLSTATE[22007]:Neplatný formát data a času:1292 Nesprávná hodnota data a času:'2019-03-10 02:00:39' pro sloupec 'updated_at' (letní čas?)

Zjistil jsem, že problém byl způsoben time_zone mého serveru MySQL nastavení na SYSTEM (a můj systém je US Central). Laravel poskytuje časová razítka, která již byla převedena na UTC, ale moje databáze je interpretuje jako centrální USA kvůli time_zone nastavení. Časy se ve skutečnosti znovu převádějí interně MySQL na "skutečnou" reprezentaci časových razítek UTC unix (což bude nesprávné, protože je posunuto časovým pásmem), i když se zdá, že jsou UTC již v každém dotazu, protože jsou také znovu převedeny zpět na US Central pro čtení ( Vím správně).

Z tohoto důvodu jsou ve 20:00:39 (20:00) místního času moje časová razítka Laravel UTC 02:00:39. MySQL interpretuje tyto časy jako centrální čas USA, a protože čas je mezi 02:00 a 03:00 (což je doba, kdy hodiny přeskakují vpřed pro centrální USA), čas je neplatný.

Nejlepším řešením pro aplikaci Laravel je přinutit každé připojení k databázi používat +00:00 timezone (nebo cokoli, co jste nastavili jako časové pásmo aplikace v config/app.php ), takže nedojde k sekundární konverzi. To lze provést v config/database.php :

'mysql' => [
    // ...

    'timezone'  => '+00:00'
],

Tímto způsobem nejste vydáni na milost a nemilost svému databázovému serveru, pokud má nakonfigurované časové pásmo odlišné od vaší aplikace Laravel. Druhou možností je změnit time_zone databáze ale stále riskujete, že se chyba bude opakovat, pokud někdy změníte hostitele nebo potřebujete z jakéhokoli důvodu přestavět server (a znovu správně nenakonfigurujete časové pásmo), nebo ovlivní jiné databáze na serveru.

Důležitá poznámka:Vzhledem k tomu, že všechna předchozí časová razítka byla interně kompenzována MySQL z nakonfigurovaného časového pásma na unixová časová razítka UTC (která byla opět chybná, protože záznamy již byly UTC), může být nutné spustit migraci dat, aby se opravila stará časová razítka. Dál jsem to nezkoumal, protože pro mou aplikaci nezáleží na tom, jestli stará časová razítka byla o několik hodin nesprávná.




  1. Jak získat pracovní dny nebo hodiny mezi dvěma daty

  2. Export/Import CSV pomocí PHPExcel

  3. Escapování zástupných znaků v LIKE

  4. ORA-06502:PL/SQL:numerická nebo hodnotová chyba:vyrovnávací paměť znakového řetězce je příliš malá