Detaillierte Erläuterung des Fehlerproblems beim Festlegen des Standardwerts 0000-00-00 in den Datums- und Datums-/Uhrzeittypen der MySQL-Datenbank

Detaillierte Erläuterung des Fehlerproblems beim Festlegen des Standardwerts 0000-00-00 in den Datums- und Datums-/Uhrzeittypen der MySQL-Datenbank

Phänomen: Nach MySQL Version 5.7 ist der Standardwert der Datums- und Datums-/Uhrzeittypen auf „0000-00-00“ eingestellt und es tritt eine Ausnahme auf: Ungültiger Standardwert für „Uhrzeit“

Grund: Überprüfen Sie die aktuelle SQL_Mode-Konfiguration im Befehlszeilenfenster:

wählen Sie @@sql_mode;

Hier sind die Ergebnisse:

NUR_VOLLSTÄNDIGE_GRUPPE_NACH, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEINE_NULL_DATUM,
ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER und NO_ENGINE_SUBSTITUTION

Die beiden Optionen NO_ZERO_IN_DATE und NO_ZERO_DATE verbieten Datums- und Zeitangaben wie 0000. Setzen Sie daher in der MySQL-Konfigurationsdatei den SQL_Mode zurück und entfernen Sie diese beiden Elemente.

Lösung

1. Unter Windows:

Verwenden Sie SET [SESSION|GLOBAL] sql_mode='modes'

Hinweis: SESSION (Standardoption): bedeutet, dass es in der aktuellen Sitzung wirksam ist; GLOBAL (Neustart erforderlich): bedeutet, dass es global wirksam ist

Sie können auch die Konfigurationsdatei my.ini ändern

***
Demo: 
    SETZEN SIE GLOBAL sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES, 
    FEHLER_FÜR_DIVISION_DURCH_NULL,KEIN_AUTO_CREATE_USER,KEIN_ENGINE_SUBSTITUTION'

1. Linux-System:

Ändern Sie die Datei my.cnf und fügen Sie [mysqld] hinzu.

Kopieren Sie den Code wie folgt:
SQL-Modus = NUR_VOLLSTÄNDIGE_GRUPPE_NUR, STRENGE_TRANS_TABELLEN, FEHLER_FÜR_DIVISION_DURCH_NULL, KEIN_AUTO_CREATE_USER, KEIN_ENGINE_SUBSTITUTION

Nachdem die Änderung abgeschlossen ist, müssen Sie MySQL neu starten

2. Mac-System:

In MacOS gibt es standardmäßig keine my.cnf-Datei. Wenn Sie MySQL anpassen müssen, kopieren Sie eine beliebige .cnf-Datei im Verzeichnis /usr/local/mysql/support-files/. Ich habe my-default.cnf kopiert und in ein anderes Verzeichnis gelegt. Nachdem ich die oben genannten Änderungen vorgenommen hatte, habe ich es in my.cnf umbenannt, in das Verzeichnis /etc kopiert und MySQL neu gestartet.

sql_mode Modus Problem Erweiterung

sql_mode Allgemeiner Wert Beschreibung

1.SQL-Syntax-Unterstützungsklasse

  • NUR_VOLLSTÄNDIGE_GRUPPE_NUR

Bei GROUP BY-Aggregationsvorgängen gilt: Wenn die Spalten in den Klauseln SELECT, HAVING oder ORDER BY nicht in GROUP BY vorkommen, ist das SQL ungültig. Dies ist verständlich, da die Spalten, die nicht in der Gruppierungsabfrage nach Spalten enthalten sind, widersprüchlich wären. In 5.7 ist es standardmäßig aktiviert, daher müssen Sie beim Upgradevorgang von 5.6 auf 5.7 auf Folgendes achten:

  • ANSI_QUOTES

Wenn ANSI_QUOTES aktiviert ist, können Sie keine Anführungszeichen zum Zitieren von Zeichenfolgen verwenden, da diese genauso wie ` als Bezeichner interpretiert werden.

Nach dem Festlegen meldet update t set f1="" ... einen Syntaxfehler wie „Unbekannte Spalte '' in 'Feldliste‘.“

  • ROHRE_ALS_CONCAT

Behandeln Sie || als einen String-Verkettungsoperator und nicht als einen Operator. Dies ist dasselbe wie bei der Oracle-Datenbank und ähnelt der String-Verkettungsfunktion CONCAT()

  • KEINE_TABELLENOPTIONEN

SHOW CREATE TABLE gibt keine MySQL-spezifische Syntax wie ENGINE aus. Dies muss berücksichtigt werden, wenn mysqldump zur Migration zwischen Datenbanktypen verwendet wird.

  • KEIN_AUTO_CREATE_USER

Es werden buchstäblich nicht automatisch Benutzer erstellt. Wenn wir einem MySQL-Benutzer eine Autorisierung erteilen, verwenden wir normalerweise GRANT ... ON ... TO dbuser, um den Benutzer gleichzeitig zu erstellen. Nach dem Festlegen dieser Option ähnelt es dem Oracle-Vorgang. Vor der Autorisierung müssen Benutzer erstellt werden. Dies ist ab 5.7.7 auch die Standardeinstellung.

2. Dateneinsicht

  • NO_ZERO_DATE

Das Datum '0000-00-00' wird als ungültig betrachtet, abhängig davon, ob der folgende strikte Modus eingestellt ist. 1. Wenn der strikte Modus eingestellt ist, wird NO_ZERO_DATE natürlich erfüllt. Aber wenn es INSERT IGNORE oder UPDATE IGNORE ist, ist „0000-00-00“ immer noch zulässig und es wird nur eine Warnung angezeigt. 2. Wenn NO_ZERO_DATE im nicht strikten Modus festgelegt ist, ist die Auswirkung dieselbe wie oben, „0000-00-00“ ist zulässig, aber es wird eine Warnung angezeigt; wenn NO_ZERO_DATE nicht festgelegt ist, wird keine Warnung ausgegeben und es wird als völlig zulässiger Wert behandelt. 3. NO_ZERO_IN_DATE ähnelt der obigen Situation, außer dass es steuert, ob das Datum und der Tag 0 sein können, d. h. ob 2010-01-00 zulässig ist.

  • KEIN_ENGINE_SUBSTITUTION

Was soll ich tun, wenn ich ENGINE mit ALTER TABLE oder CREATE TABLE angebe und die erforderliche Speicher-Engine deaktiviert oder nicht kompiliert ist? Wenn NO_ENGINE_SUBSTITUTION aktiviert ist, wird direkt ein Fehler ausgegeben. Wenn dieser Wert nicht festgelegt ist, verwendet CREATE stattdessen die Standardspeicher-Engine, ATLER nimmt keine Änderungen vor und gibt eine Warnung aus.

  • STRICT_TRANS_TABLES

Durch diese Einstellung wird der strikte Modus aktiviert.

Beachten Sie, dass STRICT_TRANS_TABLES keine Kombination mehrerer Strategien ist, sondern sich auf den Umgang mit fehlenden oder ungültigen Werten bei INSERT und UPDATE bezieht: Die Übergabe von '' an int ist im strikten Modus unzulässig. Wenn der nicht strikte Modus aktiviert ist, wird es 0 und eine Warnung wird generiert.
Außerhalb des Bereichs, wird zum maximalen Grenzwert des Inserts

Ein Wert fehlt, wenn eine neue einzufügende Zeile keinen Wert für eine Spalte ungleich NULL enthält, die keine explizite DEFAULT-Klausel in ihrer Definition hat.

MySQL 5.0 und höhere Versionen unterstützen drei SQL-Mode-Modi: set @@sql_mode=xxx Modusname;

Der von uns häufig festgelegte SQL-Modus ist ANSI, STRICT_TRANS_TABLES, TRADITIONAL, wobei ANSI und TRADITIONAL Kombinationen der oben genannten sind.

3.ANSI-Modus: Loose-Modus, überprüfen Sie die eingefügten Daten. Wenn sie nicht dem definierten Typ oder der definierten Länge entsprechen, passen Sie den Datentyp an oder kürzen Sie ihn vor dem Speichern und geben Sie eine Warnung aus.

4. TRADITIONELLER Modus: Strenger Modus. Beim Einfügen von Daten in die MySQL-Datenbank wird eine strenge Datenüberprüfung durchgeführt, um sicherzustellen, dass keine falschen Daten eingefügt werden können und ein Fehler gemeldet wird. Bei Verwendung für Transaktionen wird die Transaktion zurückgesetzt.

3. STRICT_TRANS_TABLES-Modus: Strenger Modus, es wird eine strenge Datenüberprüfung durchgeführt, falsche Daten können nicht eingefügt werden und ein Fehler wird gemeldet.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Beispiel zum Ändern der Standarddatenbank in MySQL in Django
  • Lösung für das Problem, dass MySQL nach dem Ändern des Standardpfads der Datenbank nicht gestartet werden kann
  • Detaillierte Erläuterung der Rolle der Standarddatenbank nach der MySQL-Installation

<<:  Detaillierte Erklärung der grep- und egrep-Befehle in Linux

>>:  JavaScript+html implementiert zufällige QR-Code-Verifizierung auf Frontend-Seiten

Artikel empfehlen

Wie Sie React forwardRef verwenden und was Sie beachten müssen

Bisher konnte react.forwardRef nicht auf höherwer...

Ein kurzer Vortrag über MySQL-Pivottabellen

Ich habe eine Produktteiletabelle wie diese: Teil...

Docker verwendet Root, um in den Container zu gelangen

Führen Sie zuerst den Docker-Container aus Führen...

Vue verwendet Monaco, um Codehervorhebung zu erreichen

Mithilfe der Vue-Sprache und Elementkomponenten m...

Praktische Lösung für die Bereitstellung von Prometheus-Containern

Umfeld Hostname IP-Adresse Aufschlag Prometheus 1...

Zusammenfassung der SQL-Deduplizierungsmethoden

Wenn wir SQL zum Extrahieren von Daten verwenden,...

Implementierungsbeispiel eines Nginx+Tomcat-Load-Balancing-Clusters

Inhaltsverzeichnis Einführung 1. Fallübersicht 2....

Einfaches Docker Swarm-Tutorial

Schwarm drei virtuelle Maschinen 132,133,134 1. I...