Używam MySql Server 5.7.11 i to zdanie:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
to nie działa. Podając błąd:
ERROR 1067 (42000): Invalid default value for 'updated'
Ale następujące:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
po prostu działa .
To samo dotyczy DATE.
Na marginesie wspomniano o tym w dokumentacji MySQL :
Typ DATA jest używany dla wartości z częścią daty, ale bez części czasu. MySQL pobiera i wyświetla wartości DATE w formacie „RRRR-MM-DD”. Obsługiwany zakres to od „1000-01-01” do „9999-12-31”.
nawet jeśli mówią również:
Nieprawidłowe wartości DATE, DATETIME lub TIMESTAMP są konwertowane na wartość „zero” odpowiedniego typu („0000-00-00” lub „0000-00-00 00:00:00”).
Biorąc również pod uwagę drugi cytat z dokumentacji MySQL, czy ktoś mógłby mi powiedzieć, dlaczego podaje ten błąd?
NULL
.Odpowiedzi:
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 :
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 poleceniemNa 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 kliencijeś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=''
wmy.cnf
systemie Linux lub MacOS. W przypadku systemu Windows należy to zrobić wmy.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
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()
funkcjiPole daty i godziny nie akceptuje domyślnej TERAZ ()
Kolejna przydatna uwaga [patrz Automatyczna inicjalizacja i aktualizacja dla TIMESTAMP i DATETIME ]
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
źródło
STRICT_TRANS_TABLES
dla moich obu instancji MySQL, lokalnego i serwera. Jednak mogę łatwo wstawić0000-00-00
w mojej instancji lokalnej, ale nie mogę w mojej instancji serwera - generowany jest błąd. Czemu? Ponieważ konfiguracja MySQL mojego serwera jestNO_ZERO_DATE
włączona. A mój lokalny tego nie ma.NO_ZERO_DATE
powinny zostać usunięteMiałem ten błąd z WAMP 3.0.6 z MySql 5.7.14.
Rozwiązanie :
zmień linię 70 (jeśli twój plik ini jest nietknięty) w
c:\wamp\bin\mysql\mysql5.7.14\my.ini
pliku zdo
i uruchom ponownie wszystkie usługi.
Spowoduje to wyłączenie trybu ścisłego. Zgodnie z dokumentacją „tryb ścisły” oznacza tryb z jednym lub obydwoma
STRICT_TRANS_TABLES
lubSTRICT_ALL_TABLES
włączonymi. Dokumentacja mówi:źródło
Doszedłem do sytuacji, w której dane zostały zmieszane między NULL i 0000-00-00 dla pola daty. Ale nie wiedziałem, jak zaktualizować '0000-00-00' do NULL, ponieważ
nie jest już dozwolone. Moje obejście było dość proste:
ponieważ wszystkie niepoprawne
my_date_field
wartości (bez względu na to, czy są prawidłowe, czy nie) pochodzą sprzed tej daty.źródło
<'0000-01-01'
ponieważ jest to oczywiście ważna data.Problem ze składnią konfiguracji
W niektórych wersjach MYSQL (testowane 5.7. *) W systemach * nix powinieneś użyć następującej składni:
Te nie będą działać:
kreska bez cytatów
podkreślenie bez cudzysłowów
podkreślenie i cytaty
Bardziej szczegółowy przegląd wartości konfiguracyjnych i trybu sql:
Jak skonfigurować stałe flagi trybu Sql
źródło
Najpierw wybierz bieżącą sesję
sql_mode
:Wtedy otrzymasz coś takiego jak ta domyślna wartość :
a następnie ustaw
sql_mode
bez'NO_ZERO_DATE'
:Jeśli masz stypendia, możesz to zrobić również dla
GLOBAL
:źródło
Po prostu dodaj linię:
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
plik wewnętrzny:
/etc/mysql/mysql.conf.d/mysqld.cnf
następnie
sudo service mysql restart
źródło
SELECT @@SESSION.sql_mode;
najpierw, a oni usuną NO_ZERO_IN_DATE, NO_ZERO_DATE i STRICT_TRANS_TABLES z tego, co ci daje. W ten sposób zachowasz wszystkie inne włączone ustawienia. Miałem dużo więcej niż tylko te dwa elementy ustawione dla mojego trybu sql. Nie wiem, co wszyscy robią, ale nie chcę ryzykować usunięcia ich w tym momencie.Działa dla 5.7.8:
Możesz utworzyć SQLFiddle, aby odtworzyć problem.
http://sqlfiddle.com/
Jeśli działa z MySQL 5.6 i 5.7.8, ale nie działa w wersji 5.7.11. Zatem prawdopodobnie będzie to błąd regresji w wersji 5.7.11.
źródło
Aby rozwiązać problem z MySQL Workbench (po zastosowaniu rozwiązania po stronie serwera):
Usuń SQL_MODE do TRADITIONAL w panelu preferencji.
źródło
Ta odpowiedź dotyczy tylko MySQL 5.7:
Najlepsza nie jest tak naprawdę ustawiona w pustym trybie sql_mode, zamiast tego użyj w PHP zmiennej sesji z:
Więc przynajmniej zachowujesz inne wartości domyślne.
To szalone, że dokumentacja mysql nie jest jasna, musisz usunąć te domyślne wartości w sql_mode:
NO_ZERO_IN_DATE, NO_ZERO_DATE, rozumiem, ale w przyszłych wersjach zostanie to wycofane.
STRICT_ALL_TABLES, z tym, zanim parametry zostaną zignorowane, więc musisz je również usunąć.
Wreszcie również TRADYCYJNE, ale dokumentacja mówi o tym parametrze: „podawaj błąd zamiast ostrzeżenia” przy wstawianiu nieprawidłowej wartości do kolumny ”, z tym parametrem nie wstawia się dat o zerowej wartości, ale bez tak.
MySQL nie jest tak naprawdę zorganizowany z tymi parametrami i kombinacjami.
źródło
Kombinacje opcji dla
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.Nie rzuca:
STRICT_TRANS_TABLES
+NO_ZERO_DATE
Rzuty:
STRICT_TRANS_TABLES
+NO_ZERO_IN_DATE
Moje ustawienia w
/etc/mysql/my.cnf
Ubuntu:źródło
źródło
W katalogu xamp / mysql / bin Otwórz "my.ini" i zmień wiersz: Sql_node for ->
„sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE”
USUŃ „NO_ZERO_IN_DATE”
źródło