Mysql
 sql >> база данни >  >> RDS >> Mysql

Laravel SQLSTATE[22007]:Невалиден формат за дата и час:1292 Неправилна стойност за дата и час:'2019-03-10 02:00:39' за колона 'updated_at' (лятно часово време?)

Разбрах, че проблемът се дължи на time_zone на моя MySQL сървър настройката е зададена на SYSTEM (и моята система е Централна в САЩ). Laravel предоставя времеви печати, които вече са преобразувани в UTC, но моята база данни ги интерпретира като US Central поради time_zone настройка. Времената всъщност се преобразуват отново вътрешно от MySQL към "реално" представяне на UTC unix времеви печат (което ще бъде неправилно, защото е изместено от часовата зона), въпреки че изглежда, че вече са UTC във всяка заявка, тъй като те също се преобразуват обратно в US Central отново за четене ( Знам правилно).

Поради това в 20:00:39 (20:00 PM) местно време моите времеви марки за Laravel UTC са 02:00:39. MySQL интерпретира тези часове като централно време в САЩ и тъй като часът е между 02:00 и 03:00 (което е, когато часовниците прескачат напред за Централно време в САЩ), часът е невалиден.

Най-доброто решение за приложение на Laravel е да принудите всяка връзка към базата данни да използва +00:00 часова зона (или каквото сте задали като часова зона на приложението в config/app.php ), така че няма да има вторично преобразуване. Това може да стане в config/database.php :

'mysql' => [
    // ...

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

По този начин не сте на милостта на вашия сървър на база данни, ако той има конфигурирана часова зона, която е различна от вашето приложение Laravel. Другата опция е да промените time_zone на базата данни настройка, но тогава все пак рискувате грешката да се повтори, ако някога смените хостове или трябва да изградите отново сървъра по някаква причина (и не конфигурирате правилно часовата зона отново), или да засегне други бази данни на сървъра.

Важна забележка:Тъй като всички предишни времеви отпечатъци бяха вътрешно компенсирани от MySQL от конфигурираната часова зона към UTC unix времеви печати (които отново бяха грешни, защото записите вече бяха UTC), може да се наложи да изпълните миграция на данни, за да коригирате стари времеви марки. Не съм проучвал по-нататък, защото за моето приложение няма значение дали старите времеви марки са били грешни с няколко часа.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намерете колона, която съдържа дадена стойност в MySQL

  2. MySQL password() функция към PHP

  3. Актуализирайте MySQL от CSV с помощта на JAVA

  4. mysql променя всички стойности в колона

  5. MySQL – MariaDB – Писане на първата съхранена процедура