Błąd jest spowodowany trybem sql, który może być trybem ścisłym, zgodnie z najnowszą dokumentacją MYSQL 5.7
Dokumentacja MySQL 5.7 mówi :
Tryb ścisły wpływa na to, czy serwer zezwala na „0000-00-00” jako prawidłową datę: Jeśli tryb ścisły nie jest włączony, dozwolony jest tryb „0000-00-00”, a wstawienia nie generują ostrzeżenia. Jeśli włączony jest tryb ścisły, „0000-00-00” jest niedozwolone, a wstawienia powodują błąd, chyba że podano również IGNORE. W przypadku INSERT IGNORE i UPDATE IGNORE dozwolone jest ustawienie „0000-00-00”, a wstawianie powoduje wyświetlenie ostrzeżenia.
Aby sprawdzić tryb MYSQL
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Wyłączanie trybu STRICT_TRANS_TABLES
Jednak aby zezwolić na format 0000-00-00 00:00:00
, musisz wyłączyć tryb STRICT_TRANS_TABLES w pliku konfiguracyjnym mysql lub poleceniem
Na rozkaz
SET sql_mode = '';
lub
SET GLOBAL sql_mode = '';
Użycie słowa kluczowego GLOBAL
wymaga super previliges i ma wpływ na operacje, które od tego momentu łączą się wszyscy klienci
jeśli powyższe nie działa, przejdź do /etc/mysql/my.cnf
(zgodnie z ubuntu) i skomentujSTRICT_TRANS_TABLES
Ponadto, jeśli chcesz na stałe ustawić tryb sql podczas uruchamiania serwera, dołącz go SET sql_mode=''
w my.cnf
systemie Linux lub MacOS. W przypadku systemu Windows należy to zrobić w my.ini
pliku.
Uwaga
Jednak tryb ścisły nie jest domyślnie włączony w MYSQL 5.6. W związku z tym nie powoduje błędu zgodnie z dokumentacją MYSQL 6, która mówi
MySQL umożliwia przechowywanie „zerowej” wartości „0000-00-00” jako „fikcyjnej daty”. W niektórych przypadkach jest to wygodniejsze niż używanie wartości NULL i zużywa mniej miejsca na dane i indeks. Aby zabronić „0000-00-00”, włącz tryb SQL NO_ZERO_DATE.
AKTUALIZACJA
Odnośnie sprawy błędu, jak powiedział @ Dylan-Su:
Nie wydaje mi się, żeby to był błąd, który wynika ze sposobu, w jaki MYSQL ewoluował w czasie, przez co pewne rzeczy ulegają zmianie w oparciu o dalsze ulepszanie produktu.
Jednak mam inny powiązany raport o błędzie dotyczący tej NOW()
funkcji
Pole daty i godziny nie akceptuje domyślnej TERAZ ()
Kolejna przydatna uwaga [patrz Automatyczna inicjalizacja i aktualizacja dla TIMESTAMP i DATETIME ]
Począwszy od MySQL 5.6.5, kolumny TIMESTAMP i DATETIME mogą być automatycznie inicjowane i aktualizowane zgodnie z aktualną datą i godziną (czyli aktualną sygnaturą czasową). Przed wersją 5.6.5 było to prawdziwe tylko dla TIMESTAMP i co najwyżej dla jednej kolumny TIMESTAMP na tabelę. Poniższe uwagi opisują najpierw automatyczną inicjalizację i aktualizację MySQL 5.6.5 i nowszych, a następnie różnice w wersjach wcześniejszych niż 5.6.5.
Aktualizacja dotycząca NO_ZERO_DATE
Od wersji MySQL 5.7.4 ten tryb jest przestarzały. W poprzedniej wersji musisz zakomentować odpowiednią linię w pliku konfiguracyjnym. Zapoznaj się z dokumentacją MySQL 5.7 w dniu NO_ZERO_DATE
NULL
.