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

Detaillierte Beispiele für Linux-Festplattengeräte- und LVM-Verwaltungsbefehle

Vorwort Im Linux-Betriebssystem sind Gerätedateie...

Detaillierte Einführung in das benutzerdefinierte Docker-Netzwerk

Inhaltsverzeichnis Benutzerdefiniertes Docker-Net...

JS verwendet die Methode „reduce()“, um Baumstrukturdaten zu verarbeiten

Inhaltsverzeichnis Definition Grammatik Beispiele...

So verwenden Sie Binlog zur Datenwiederherstellung in MySQL

Vorwort Kürzlich wurden Daten online falsch bearb...

Eine kurze Einführung in die Gesamtstruktur von Tomcat

Tomcat ist weithin als Webcontainer bekannt. Es h...

Zusammenfassung relevanter Erkenntnisse zur Umsetzung adaptiven Webdesigns

Wie funktioniert „Adaptives Webdesign“? Eigentlich...

Ubuntu 20.04 – Bestes Konfigurationshandbuch (unverzichtbar für Anfänger)

1. Systemkonfiguration 1. Deaktivieren Sie das Su...

CSS, um den kleinen scharfen Eckeneffekt von Blasen zu erzielen

Effektbild (die Rahmenfarbe ist zu hell, setzen S...

Detaillierte Erklärung der Destrukturierungszuweisung in JavaScript

Inhaltsverzeichnis Konzept Array-Destrukturierung...

Tutorial zur Installation von Apache 2.4.41 unter Windows 10

1. Installation und Konfiguration von Apache 2.4....

Detaillierte Erläuterung der MySQL-Benutzerrechteverwaltung

Inhaltsverzeichnis Vorwort: 1. Einführung in die ...

So implementieren Sie Bildmapping mit CSS

1. Einleitung Mit Imagemaps können Sie Bereiche e...

Implementierung der Vue-Anmeldefunktion

Inhaltsverzeichnis Vorne geschrieben Anmeldeübers...