sql >> Database >  >> RDS >> Mysql

Laravel SQLSTATE [22007]:Ongeldig datetime-formaat:1292 Onjuiste datetime-waarde:'2019-03-10 02:00:39' voor kolom 'updated_at' (zomertijd?)

Ik kwam erachter dat het probleem te wijten was aan de time_zone van mijn MySQL-server instelling wordt ingesteld op SYSTEM (en mijn systeem is US Central). Laravel levert tijdstempels die al zijn geconverteerd naar UTC, maar mijn database interpreteert ze als US Central vanwege de time_zone instelling. De tijden worden daadwerkelijk opnieuw geconverteerd intern door MySQL naar een "echte" UTC Unix-tijdstempelweergave (die onjuist zal zijn omdat deze wordt gecompenseerd door de tijdzone), ook al lijken ze al in elke zoekopdracht UTC te zijn, omdat ze ook opnieuw worden geconverteerd naar US Central om te lezen ( Ik weet het goed).

Hierdoor zijn mijn Laravel UTC-tijdstempels om 20:00:39 (20:00 uur) lokale tijd 02:00:39. MySQL interpreteert deze tijden als US Central-tijd, en omdat de tijd tussen 02:00 en 03:00 is (dat is wanneer klokken vooruitspringen voor US Central), is de tijd ongeldig.

De beste oplossing voor een Laravel-toepassing is om elke databaseverbinding te forceren om een ​​+00:00 . te gebruiken tijdzone (of wat je ook hebt ingesteld als de tijdzone van de applicatie in config/app.php) ) zodat er geen secundaire conversie plaatsvindt. Dit kan in config/database.php :

'mysql' => [
    // ...

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

Op deze manier bent u niet overgeleverd aan uw databaseserver als deze een geconfigureerde tijdzone heeft die afwijkt van uw Laravel-toepassing. De andere optie is om de time_zone van de database te wijzigen instelling, maar dan loop je nog steeds het risico dat de bug terugkeert als je ooit van host verandert of de server om welke reden dan ook opnieuw moet opbouwen (en de tijdzone niet opnieuw correct configureert), of andere databases op de server beïnvloedt.

Belangrijke opmerking:aangezien alle eerdere tijdstempels intern door MySQL werden verschoven van de geconfigureerde tijdzone naar UTC Unix-tijdstempels (die wederom verkeerd waren omdat de records al UTC waren), kan het nodig zijn om een ​​gegevensmigratie uit te voeren om de oude tijdstempels. Ik heb niet verder onderzocht omdat het voor mijn toepassing niet uitmaakt of de oude tijdstempels een paar uur verkeerd waren.




  1. Datatype/structuur om tijdzone-offset op te slaan in MySQL

  2. MYSQL Selecteren uit tabellen op basis van meerdere rijen

  3. Een 32-bits applicatie verbinden met jBASE

  4. Een Oracle-functie aanroepen vanuit Java