Ich verwende MySql Server 5.7.11 und diesen Satz:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
wird nicht funktionieren. Den Fehler geben:
ERROR 1067 (42000): Invalid default value for 'updated'
Aber folgendes:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
funktioniert einfach .
Der gleiche Fall für DATE.
Als Nebenbemerkung wird es in den MySQL-Dokumenten erwähnt :
Der Typ DATE wird für Werte mit einem Datumsteil, aber keinem Zeitteil verwendet. MySQL ruft DATE-Werte im Format 'JJJJ-MM-TT' ab und zeigt sie an. Der unterstützte Bereich ist '1000-01-01' bis '9999-12-31'.
auch wenn sie auch sagen:
Ungültige DATE-, DATETIME- oder TIMESTAMP-Werte werden in den Wert „Null“ des entsprechenden Typs ('0000-00-00' oder '0000-00-00 00:00:00') konvertiert.
Kann mich jemand unter Berücksichtigung des zweiten Zitats aus der MySQL-Dokumentation wissen lassen, warum dieser Fehler auftritt?
NULL
.Antworten:
Der Fehler ist auf den SQL-Modus zurückzuführen, der gemäß der neuesten MYSQL 5.7-Dokumentation ein strikter Modus sein kann
In der MySQL-Dokumentation 5.7 heißt es :
So überprüfen Sie den MYSQL-Modus
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Deaktivieren des STRICT_TRANS_TABLES-Modus
Um das Format zuzulassen, müssen
0000-00-00 00:00:00
Sie jedoch den STRICT_TRANS_TABLES-Modus in der MySQL-Konfigurationsdatei oder per Befehl deaktivierenAuf Befehl
SET sql_mode = '';
oder
SET GLOBAL sql_mode = '';
Die Verwendung des Schlüsselworts
GLOBAL
erfordert hervorragende Vorkenntnisse und wirkt sich auf die Vorgänge aus, die alle Clients ab diesem Zeitpunkt verbindenWenn oben nicht funktioniert, gehen Sie zu
/etc/mysql/my.cnf
(gemäß Ubuntu) und kommentieren Sie ausSTRICT_TRANS_TABLES
Auch, wenn Sie wollen , um den SQL - Modus beim Start des Servers fest eingestellt ist dann
SET sql_mode=''
inmy.cnf
unter Linux oder MacOS. Für Windows muss dies in einermy.ini
Datei erfolgen.Hinweis
Der strikte Modus ist in MYSQL 5.6 jedoch standardmäßig nicht aktiviert. Daher produziert sie nicht den Fehler pro Dokumentation MYSQL 6 , die besagt ,
AKTUALISIEREN
In Bezug auf die Bug-Angelegenheit, wie von @ Dylan-Su gesagt:
Ich denke nicht, dass dies der Fehler ist, wie sich MYSQL im Laufe der Zeit entwickelt hat, aufgrund dessen einige Dinge aufgrund weiterer Verbesserungen des Produkts geändert werden.
Ich habe jedoch einen anderen verwandten Fehlerbericht bezüglich der
NOW()
FunktionDas Datum / Uhrzeit-Feld akzeptiert keine Standard-JETZT ()
Ein weiterer nützlicher Hinweis [siehe Automatische Initialisierung und Aktualisierung für TIMESTAMP und DATETIME ]
Update bezüglich NO_ZERO_DATE
Ab MySQL ab 5.7.4 ist dieser Modus veraltet. Für die vorherige Version müssen Sie die entsprechende Zeile in der Konfigurationsdatei auskommentieren. Weitere Informationen finden Sie in der MySQL 5.7-Dokumentation zu NO_ZERO_DATE
quelle
STRICT_TRANS_TABLES
für meine MySQL-Instanzen sowohl lokale als auch Server. Ich kann zwar problemlos0000-00-00
in meine lokale Instanz einfügen , aber nicht in meine Serverinstanz - Fehler wird ausgelöst. Warum? Weil mein Server MySQL configNO_ZERO_DATE
aktiviert hat. Und mein Einheimischer hat es nicht.NO_ZERO_DATE
sollte entfernt werdenIch hatte diesen Fehler mit WAMP 3.0.6 mit MySql 5.7.14.
Lösung :
Ändern Sie Zeile 70 (wenn Ihre INI-Datei unberührt ist) in der
c:\wamp\bin\mysql\mysql5.7.14\my.ini
Datei vonzu
und starten Sie alle Dienste neu.
Dadurch wird der strikte Modus deaktiviert. Gemäß der Dokumentation bedeutet "strikter Modus" einen Modus mit einem oder beiden
STRICT_TRANS_TABLES
oderSTRICT_ALL_TABLES
aktiviert. Die Dokumentation sagt:quelle
Ich kam in eine Situation, in der die Daten für ein Datumsfeld zwischen NULL und 0000-00-00 gemischt wurden. Aber ich wusste nicht, wie ich die '0000-00-00' auf NULL aktualisieren sollte, weil
ist nicht mehr erlaubt. Meine Problemumgehung war ganz einfach:
weil alle falschen
my_date_field
Werte (ob korrekte Daten oder nicht) von vor diesem Datum stammten.quelle
<'0000-01-01'
da es sich natürlich um ein gültiges Datum handelt.Problem mit der Konfigurationssyntax
Auf einigen Versionen von MYSQL (getestet 5.7. *) Unter * nix-Systemen sollten Sie diese Syntax verwenden:
Diese werden nicht funktionieren:
Strich keine Anführungszeichen
unterstreiche keine Anführungszeichen
Unterstrich und Zitate
Eine umfassendere Überprüfung der Konfigurationswerte und des SQL-Modus:
So richten Sie permanente SQL-Modus-Flags ein
quelle
Wählen Sie zuerst die aktuelle Sitzung aus
sql_mode
:Dann erhalten Sie so etwas wie diesen Standardwert :
und dann setzen
sql_mode
ohne'NO_ZERO_DATE'
:Wenn Sie Stipendien haben, können Sie dies auch tun für
GLOBAL
:quelle
Fügen Sie einfach die Zeile hinzu:
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Insider-Datei:
/etc/mysql/mysql.conf.d/mysqld.cnf
dann
sudo service mysql restart
quelle
SELECT @@SESSION.sql_mode;
zuerst vorschlagen , und sie entfernen NO_ZERO_IN_DATE, NO_ZERO_DATE und STRICT_TRANS_TABLES von dem, was es Ihnen gibt. Auf diese Weise behalten Sie alle anderen Einstellungen bei, die Sie aktiviert haben. Ich hatte viel mehr als nur diese beiden Elemente für meinen SQL-Modus eingestellt. Ich weiß nicht, was sie alle tun, aber ich möchte nicht riskieren, sie an dieser Stelle zu entfernen.Es funktioniert für 5.7.8:
Sie können eine SQLFiddle erstellen, um Ihr Problem neu zu erstellen.
http://sqlfiddle.com/
Wenn es für MySQL 5.6 und 5.7.8 funktioniert, aber am 5.7.11 fehlschlägt. Dann ist es wahrscheinlich ein Regressionsfehler für 5.7.11.
quelle
So lösen Sie das Problem mit MySQL Workbench (nach dem Anwenden der Lösung auf der Serverseite):
Entfernen Sie SQL_MODE zu TRADITIONAL im Einstellungsfenster.
quelle
Diese Antwort ist nur für MySQL 5.7:
Das Beste ist, dass der sql_mode nicht wirklich leer gesetzt wird. Verwenden Sie stattdessen in PHP eine Sitzungsvariable mit:
Zumindest behalten Sie also die anderen Standardwerte bei.
Es ist verrückt, dass die MySQL-Dokumentation nicht klar ist. Sie müssen diese Standardwerte in sql_mode löschen:
NO_ZERO_IN_DATE, NO_ZERO_DATE, ich verstehe, aber in zukünftigen Versionen wird dies eingestellt.
STRICT_ALL_TABLES, bevor Parameter ignoriert werden, müssen Sie sie ebenfalls löschen.
Schließlich auch TRADITIONAL, aber die Dokumentation spricht über diesen Parameter: "Geben Sie einen Fehler anstelle einer Warnung", wenn Sie einen falschen Wert in eine Spalte einfügen ", mit diesem Parameter werden Daten mit Nullwerten nicht eingefügt, aber ohne Ja.
MySQL ist mit diesen Parametern und Kombinationen nicht wirklich organisiert.
quelle
Optionskombinationen für
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.Wirft nicht:
STRICT_TRANS_TABLES
+NO_ZERO_DATE
Würfe:
STRICT_TRANS_TABLES
+NO_ZERO_IN_DATE
Meine Einstellungen
/etc/mysql/my.cnf
unter Ubuntu:quelle
quelle
Im Verzeichnis xamp / mysql / bin Öffnen Sie "my.ini" und ändern Sie die Zeile: Sql_node für ->
"sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE"
ENTFERNEN SIE "NO_ZERO_IN_DATE"
quelle