Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Błąd w MySQL podczas ustawiania domyślnej wartości DATE lub DATETIME

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 ma wpływ na to, czy serwer zezwala na „0000-00-00” jako prawidłową datę:Jeśli tryb ścisły nie jest włączony, dozwolony jest „0000-00-00”, a wstawki nie generują ostrzeżenia. Jeśli tryb ścisły jest włączony, „0000- 00-00' jest niedozwolone, a wstawki powodują błąd, chyba że podano również IGNORE. W przypadku INSERT IGNORE i UPDATE IGNORE dozwolone jest „0000-00-00”, a wstawki generują ostrzeżenie.

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 komendą

Na polecenie

SET sql_mode = '';

lub

SET GLOBAL sql_mode = '';

Używanie słowa kluczowego GLOBAL wymaga superuprawnień i wpływa na operacje, które od tego czasu łączą wszyscy klienci

jeśli powyższe nie działa, przejdź do /etc/mysql/my.cnf (zgodnie z ubuntu) i skomentuj STRICT_TRANS_TABLES

Ponadto, jeśli chcesz na stałe ustawić tryb sql podczas uruchamiania serwera, dołącz SET sql_mode='' w my.cnf w systemie Linux lub MacOS. W przypadku systemu Windows należy to zrobić w my.ini plik.

Uwaga

Jednak tryb ścisły nie jest domyślnie włączony w MYSQL 5.6. Dlatego nie powoduje błędu zgodnie z Dokumentacja MYSQL 6 co mówi

MySQL pozwala na przechowywanie wartości „zerowej” „0000-00-00” jako „fałszywej daty”. W niektórych przypadkach jest to wygodniejsze niż używanie wartości NULL i zużywa mniej miejsca na dane i indeksy. Aby zabronić '0000-00-00', włącz tryb SQL NO_ZERO_DATE.

AKTUALIZUJ

Odnośnie sprawy błędu, jak powiedział @Dylan-Su:

Nie sądzę, że jest to błąd w sposobie, w jaki MYSQL ewoluował na przestrzeni czasu, przez co niektóre rzeczy są zmieniane w oparciu o dalsze ulepszanie produktu.

Mam jednak inny powiązany raport o błędzie dotyczący NOW() funkcja

Pole daty i godziny nie akceptuje domyślnej funkcji NOW()

Kolejna przydatna uwaga [patrz Automatyczna inicjalizacja i aktualizacja dla TIMESTAMP i DATETIME ]

Od wersji MySQL 5.6.5 kolumny TIMESTAMP i DATETIME mogą być automatycznie inicjowane i aktualizowane do bieżącej daty i godziny (czyli aktualnego znacznika czasu). Przed 5.6.5 dotyczy to tylko TIMESTAMP i co najwyżej jednej kolumny TIMESTAMP na tabelę. Poniższe uwagi najpierw opisują automatyczną inicjalizację i aktualizację dla MySQL 5.6.5 i nowszych, a następnie różnice dla wersji wcześniejszych niż 5.6.5.

Aktualizacja dotycząca NO_ZERO_DATE

W MySQL od 5.7.4 ten tryb jest przestarzały. W przypadku poprzedniej wersji musisz zakomentować odpowiednią linię w pliku konfiguracyjnym. Zapoznaj się z dokumentacją MySQL 5.7 NO_ZERO_DATE



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przegląd replikacji krzyżowej PostgreSQL i MySQL

  2. Jak wykryć, że transakcja została już rozpoczęta?

  3. Jak utworzyć nowy diagram bazy danych za pomocą środowiska pracy MySQL?

  4. Jak znaleźć znaki spoza ASCII w MySQL?

  5. Jak dodać niestandardowe ograniczenie CHECK w tabeli MySQL?