Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Laravel SQLSTATE[22007]:Ungültiges Datetime-Format:1292 Falscher Datetime-Wert:'2019-03-10 02:00:39' für Spalte 'updated_at' (Sommerzeit?)

Ich fand heraus, dass das Problem auf die time_zone meines MySQL-Servers zurückzuführen war Einstellung auf SYSTEM eingestellt ist (und mein System ist US Central). Laravel stellt Zeitstempel bereit, die bereits in UTC konvertiert wurden, aber meine Datenbank interpretiert sie aufgrund der time_zone als US Central Einstellung. Die Zeiten werden tatsächlich wieder umgerechnet intern von MySQL in eine "echte" UTC-Unix-Zeitstempeldarstellung (die falsch sein wird, weil sie durch die Zeitzone versetzt ist), obwohl sie bereits in jeder Abfrage als UTC erscheinen, weil sie zum Lesen auch wieder zurück in US Central konvertiert werden ( Ich weiß recht).

Aus diesem Grund sind meine Laravel-UTC-Zeitstempel um 20:00:39 (20:00 Uhr) Ortszeit 02:00:39. MySQL interpretiert diese Uhrzeiten als US Central Time, und da die Zeit zwischen 02:00 und 03:00 liegt (das ist, wenn die Uhren für US Central vorrücken), ist die Zeit ungültig.

Die beste Lösung für eine Laravel-Anwendung besteht darin, jede Datenbankverbindung zu zwingen, ein +00:00 zu verwenden timezone (oder was auch immer Sie als Anwendungszeitzone in config/app.php festgelegt haben ), sodass keine sekundäre Konvertierung stattfindet. Dies kann in config/database.php erfolgen :

'mysql' => [
    // ...

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

Auf diese Weise sind Sie Ihrem Datenbankserver nicht ausgeliefert, wenn er eine konfigurierte Zeitzone hat, die sich von Ihrer Laravel-Anwendung unterscheidet. Die andere Möglichkeit besteht darin, die time_zone der Datenbank zu ändern Einstellung, aber Sie riskieren immer noch, dass der Fehler erneut auftritt, wenn Sie jemals den Host wechseln oder den Server aus irgendeinem Grund neu erstellen müssen (und die Zeitzone nicht erneut korrekt konfigurieren) oder andere Datenbanken auf dem Server beeinträchtigt.

Wichtiger Hinweis:Da alle vorherigen Zeitstempel intern von MySQL von der konfigurierten Zeitzone auf UTC-Unix-Zeitstempel verschoben wurden (die wiederum falsch waren, weil die Datensätze bereits UTC waren), kann es erforderlich sein, eine Datenmigration durchzuführen, um dies zu korrigieren alte Zeitstempel. Ich habe nicht weiter nachgeforscht, weil es für meine Anwendung keine Rolle spielt, ob die alten Zeitstempel um ein paar Stunden falsch waren.