Lösung für MySQL-Fehler beim Ändern des SQL-Modus

Lösung für MySQL-Fehler beim Ändern des SQL-Modus

Ein Mord verursacht durch ERR 1067

Als ich heute die SQL-Anweisung in Navicat ausführte, um eine Datentabelle zu erstellen, trat der Fehler Err 1067 auf. Bei manchen MySQL-Versionen von Kollegen ist diese Anweisung korrekt, bei anderen jedoch führt sie zu einem Fehler. Ist das nicht ärgerlich?

Der Grund war, dass der Standardwert des Zeitstempels falsch war.

Den Informationen zufolge gibt es in MySQL 5.7 einen STRICT-Modus. In diesem Modus darf der Datumswert standardmäßig nicht vollständig auf 0-Werte gesetzt werden.

Um dieses Problem zu lösen, müssen Sie den Wert von sql_mode ändern.

Die Quelle des zweiten Problems ist sql_mode

Wir können in MySQL gehen, um herauszufinden, was der SQL-Modus ist. Geben Sie zunächst das Bin-Verzeichnis unter dem MySQL-Installationsverzeichnis ein und melden Sie sich als Administratorbenutzer bei der MySQL-Datenbank an.

Verwenden Sie den Befehl mysql –h localhost –u root–p, wobei -h der angegebene Hostname oder die IP-Adresse, -u der angegebene Benutzer und -p die Anmeldung mit dem Kennwort ist.

Verwenden Sie den Befehl „select @@sql_mode;“, um den Wert von „sql_mode“ anzuzeigen. Wenn ich einen Befehl eingebe, aber nichts passiert, sondern nur -> erscheint, dann denke ich

Wahrscheinlich haben Sie das ";" nicht eingegeben, so wie ich.

Aus den Ergebnissen in der obigen Abbildung können wir erkennen, dass sql_mode NO_ZERO_IN_DATE und NO_ZERO_DATE hat. Geben Sie in der Befehlszeile ein

setze sql_mode=(select replace(@@sql_mode,'NO_ZERO_IN_DATE,NO_ZERO_DATE','')); Du kannst sql_mode ändern.

Sie können dann den Wert von sql_mode überprüfen. Es kann festgestellt werden, dass NO_ZERO_IN_DATE und NO_ZERO_DATE erfolgreich entfernt wurden.

Ich habe die SQL-Anweisung zum Erstellen der Tabelle erneut ausgeführt, aber es hat nicht funktioniert und der Fehler 1067 ist trotzdem aufgetreten. Denken Sie nicht an ein Problem mit der falschen Haltung. Es liegt lediglich daran, dass der globale SQL-Modus nicht festgelegt ist und der hier festgelegte SQL-Modus keine Auswirkungen auf die Gesamtsituation hat.

Verwenden Sie den Befehl „select @@global.sql_mode;“, um den Wert des globalen SQL-Modus anzuzeigen.

Die verbleibenden Vorgänge sind dieselben wie bei den vorherigen SQL_Mode-Einstellungen, außer dass der vorherige SQL_Mode durch @@global.sql_mode ersetzt wird, wie in der Abbildung gezeigt.

Nach Abschluss der Einstellungen können Sie das SQL-Statement in Navicat erneut ausführen, vorher müssen Sie sich jedoch erneut mit der Datenbank verbinden, da es sonst immer noch fehlschlägt.

Fragen Sie mich nicht warum, nennen Sie mich einfach Lei Feng. Die Ergebnisse sind wie folgt:

OK, dieses Mal wurde die Tabelle erfolgreich erstellt und es wurde der Fehler Err 1055 ausgegeben, was bedeutet: „Es kann keine Tabelle erstellt werden, die ein nicht aggregiertes Informationsschema für die Spalte enthält.“

PROFILING.SEQ ist gruppiert, diese Funktion basiert nicht mehr auf Gruppierung und ist mit der neuen Regel sql_mode=only_full_group_by inkompatibel. Es heißt auch, dass dies auf

Dies wird durch „ONLY_FULL_GROUP_BY“ im SQL-Modus verursacht. Der SQL_Mode kann erneut geändert werden.

Löschen Sie die zuvor erstellte Tabelle, stellen Sie die Verbindung zur Datenbank erneut her, führen Sie die SQL-Anweisung aus und dann ist alles in Ordnung.

Natürlich stellt diese Lösung nur eine Übergangslösung dar. Nach einem Neustart der MySQL-Datenbank werden alle mit großem Aufwand eingestellten Werte wieder auf den Zustand vor der Freigabe zurückgesetzt.

Hierfür gibt es eine Lösung, die ich Ihnen im Folgenden vorstelle.

3. SQL_Mode festlegen

Sie können den SQL-Modus festlegen, indem Sie die Konfigurationsdatei so ändern, dass sich der Wert des SQL-Modus nach dem Neustart der Datenbank nicht ändert.

Zunächst müssen wir die Reihenfolge kennen, in der MySQL-Konfigurationsdateien geladen werden. Gehen Sie in das Bin-Verzeichnis des Datenbankinstallationsverzeichnisses und verwenden Sie den Befehl

Sie können es sehen, indem Sie mysqld --verbose --help ausführen, aber die Ausgabe dieses Befehls ist zu lang und ich habe noch keinen geeigneteren Befehl zum Anzeigen gefunden.

Die Ladereihenfolge ist wie folgt:

Wenn diese Konfigurationsdateien geladen werden, überschreiben die später geladenen Dateien dieselben Werte in den zuvor geladenen Konfigurationsdateien. Aber ich habe es nur im MySQL-Installationsverzeichnis gefunden

Eine Konfigurationsdatei mit einem sehr ähnlichen Namen, der Rest wurde nicht gefunden.

Ändern Sie nach dem Sichern dieser Datei den Namen in my.ini, damit er der Datei in der angegebenen Reihenfolge des Ladens der Konfigurationsdateien entspricht. Öffnen Sie dann die Datei, meine Konfiguration hier

In der Datei gibt es nur zwei Werte für sql_mode.

Überprüfen Sie nach dem Neustart der Datenbank mit dem Befehl den Wert von sql_mode und stellen Sie fest, dass dieser genau mit dem in der Konfigurationsdatei übereinstimmt. Fertig!

Zusätzliche Einführung in mehrere allgemeine sql_mode-Werte:

Einführung in mehrere gängige Modi

  • ONLY_FULL_GROUP_BY : Spalten, die in der Select-Anweisung, der HAVING-Bedingung und der ORDER BY-Anweisung erscheinen, müssen GROUP BY-Spalten oder Funktionsspalten sein, die von GROUP BY-Spalten abhängen.
  • NO_AUTO_VALUE_ON_ZERO : Dieser Wert betrifft das Einfügen von Auto-Increment-Spalten. Standardmäßig wird durch das Einfügen von 0 oder NULL der nächste Auto-Inkrement-Wert generiert. Diese Option ist nützlich, wenn der Benutzer einen Wert von 0 einfügen möchte und die Spalte automatisch inkrementiert wird.
  • STRICT_TRANS_TABLES : Wenn in diesem Modus ein Wert nicht in eine Transaktionstabelle eingefügt werden kann, wird der aktuelle Vorgang unterbrochen und es werden keinen Einschränkungen für nicht-transaktionale Tabellen auferlegt.
  • NO_ZERO_IN_DATE : Dieser Modus bestimmt, ob Monat und Tag eines Datums Nullen enthalten dürfen. Wenn dieser Modus aktiviert ist, ist der 00.01.2016 nicht zulässig, der 01.02.0000 jedoch schon. Das tatsächliche Verhalten wird davon beeinflusst, ob der strikte Modus aktiviert ist.
  • NO_ZERO_DATE : Legen Sie diesen Wert fest. Die MySQL-Datenbank erlaubt nicht die Eingabe von Nulldaten. Das tatsächliche Verhalten wird davon beeinflusst, ob der strikte Modus aktiviert ist.
  • ERROR_FOR_DIVISION_BY_ZERO : Wenn während eines INSERT- oder UPDATE-Vorgangs Daten durch Null geteilt werden, wird statt einer Warnung ein Fehler generiert. Wenn dieser Modus nicht angegeben ist, gibt MySQL NULL zurück, wenn der Wert durch Null geteilt wird.
  • NO_AUTO_CREATE_USER : Verhindert, dass GRANT Benutzer mit leeren Passwörtern erstellt
  • NO_ENGINE_SUBSTITUTION : Gibt einen Fehler aus, wenn die erforderliche Speicher-Engine deaktiviert oder nicht kompiliert ist. Wenn dieser Wert nicht festgelegt ist, wird stattdessen die Standardspeicher-Engine verwendet und eine Ausnahme ausgelöst.
  • PIPES_AS_CONCAT : Behandeln Sie "||" als String-Verkettungsoperator statt als OR-Operator, was dasselbe ist wie bei der Oracle-Datenbank und ähnlich der String-Verkettungsfunktion Concat.
  • ANSI_QUOTES : Wenn ANSI_QUOTES aktiviert ist, können Sie keine Anführungszeichen zum Zitieren von Zeichenfolgen verwenden, da diese als Bezeichner interpretiert werden.

Dies ist das Ende dieses Artikels zur Behebung des Fehlers beim Ändern des MySQL-SQL-Modus. Weitere relevante Inhalte zum MySQL-SQL-Modus finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Verwendung von MySQL sql_mode
  • Gründe und Lösungen für das Nicht-Wirksamwerden der MySQL-SQL-Modus-Änderung
  • Detaillierte Erklärung zum Anzeigen und Einstellen des SQL-Modus in MySQL
  • MySQL sql_mode-Analyse und Einstellungserklärung
  • Die Fallstricke und Lösungen, die durch den Standardwert von sql_mode in MySQL 5.7 verursacht werden
  • Lösen Sie das MySQL 5.7.9 Version sql_mode=only_full_group_by Problem
  • Detaillierte Erklärung der Verwendung des SQL-Modus in MySQL

<<:  Die detaillierteste Methode zur Installation von Docker auf CentOS 8

>>:  Zusammenfassung der genauen Berechnungen verschiedener Abstände/Scrolldistanzen in einem Fenster

Artikel empfehlen

HTML-Lernhinweise – Detaillierte Erklärung der HTML-Syntax (unbedingt lesen)

1. Was ist die HTML-Auszeichnungssprache? HTML is...

Docker konfiguriert den Speicherort lokaler Images und Container

Verwenden Sie den Befehl „Find“, um Dateien zu fi...

Drei Möglichkeiten zum Erstellen eines Graueffekts auf Website-Bildern

Ich habe schon immer Graustufenbilder bevorzugt, d...

Detaillierte Erklärung des JavaScript-Stacks und der Kopie

Inhaltsverzeichnis 1. Definition des Stapels 2. J...

Mehrere Möglichkeiten zum Einfügen von SVG in HTML-Seiten

SVG (Scalable Vector Graphics) ist ein Bildformat...

Detailliertes Verständnis des Lebenszyklusvergleichs zwischen Vue2 und Vue3

Inhaltsverzeichnis Zyklusvergleich Verwendung Zus...

Was ist Makefile in Linux? Wie funktioniert es?

Führen Sie Ihre Programme mit diesem praktischen ...

Einführung in die Verwendung mehrerer spezieller Attribut-Tags in HTML

Die folgenden Attribute sind nicht sehr browserkom...

So erstellen Sie ein Apr-Modul zur Tomcat-Leistungsoptimierung

Vorwort Tomcat ist ein weit verbreiteter Java-Web...

So ändern Sie die Kodierung der MySQL-Datenbank in utf8mb4

Die utf8mb4-Kodierung ist eine Obermenge der utf8...