MySQL sql_mode-Analyse und Einstellungserklärung

MySQL sql_mode-Analyse und Einstellungserklärung

Beim Einfügen eines Datensatzes in die MySQL-Datenbank ist gestern Abend ein Fehler aufgetreten! Die Datenbank meldete mir gnadenlos einen Fehler: ERROR 1365(22012):Division by 0 ; das bedeutet: Das Ergebnis einer Operation mit einer Division durch 0 kann nicht in die Datenbank eingefügt werden. Also habe ich gegoogelt und schließlich den Grund herausgefunden: Es lag daran, dass der SQL-Mode-Modus von MySQL einige sogenannte „illegale“ Vorgänge einschränkte.

Analyse

Kurz gesagt definiert sql_mode die SQL-Syntax, die MySQL unterstützen soll, die Datenvalidierung usw. .

So zeigen Sie den von der aktuellen Datenbank verwendeten SQL-Modus an:

mysql> wähle @@sql_mode;

Hier ist das aktuelle Schema meiner Datenbank:

Der MySQL-Server kann in verschiedenen SQL-Modi arbeiten und diese Modi für verschiedene Clients auf unterschiedliche Weise anwenden. Dadurch können Anwendungen den Serverbetrieb an ihre Anforderungen anpassen. Solche Modi definieren die SQL-Syntax, die MySQL unterstützen soll, und welche Validierungsprüfungen an den Daten durchgeführt werden sollen. Dies erleichtert die Verwendung von MySQL mit anderen Datenbankservern in vielen verschiedenen Umgebungen. Ab MySQL 4.1 können Sie den Modus auch ändern, indem Sie die Variable sql_mode nach dem Start mit SET[SESSION|GLOBAL]sql_mode='mode1,mode2… ' festlegen.

sql_mode Allgemeine Werte

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.

Bei ungültigen SQL-Anweisungen wird bei der Ausführung folgender Fehler gemeldet:

ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'postscan.verifyDelayLog.auditor' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

KEIN_AUTOMATISCHER_WERT_ BEI_NULL

Dieser Wert wirkt sich auf Einfügungen in Auto-Increment-Spalten aus. 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 keine Einschränkungen für Nicht-Transaktionstabellen auferlegt.

KEINE_NULL_IM_DATUM

Im strikten Modus werden Daten mit einem Monats- oder Tagesteil von 0 nicht akzeptiert. Wenn wir die Option IGNORE verwenden, fügen wir für ähnliche Daten „0000-00-00“ ein. Im nicht strikten Modus wird das Datum akzeptiert, aber eine Warnung generiert.

NO_ZERO_DATE

Im strengen Modus wird „0000-00-00“ nicht als gültiges Datum betrachtet. Mit der Option IGNORE können Sie weiterhin Nulldaten einfügen. Im nicht strikten Modus wird das Datum akzeptiert, aber eine Warnung generiert.

FEHLER BEI DIVISION DURCH NULL

Wenn bei einem INSERT oder UPDATE Daten durch Null geteilt werden, wird ein Fehler und keine Warnung generiert. Wenn dieser Modus nicht angegeben ist, gibt MySQL NULL zurück, wenn der Wert durch Null geteilt wird.

KEIN_AUTO_CREATE_USER

Verhindern Sie, dass GRANT Benutzer mit leeren Passwörtern erstellt

KEIN_ENGINE_SUBSTITUTION

Wenn eine erforderliche Speicher-Engine deaktiviert oder nicht kompiliert ist, wird ein Fehler ausgegeben. Wenn dieser Wert nicht festgelegt ist, wird stattdessen die Standardspeicher-Engine verwendet und eine Ausnahme ausgelöst.

ROHRE_ALS_CONCAT

Behandeln Sie „||“ als Zeichenfolgenverkettungsoperator und nicht als ODER-Operator. Dies entspricht der Oracle-Datenbank und ähnelt der Zeichenfolgenverkettungsfunktion 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.

MySQL 5.0 und höhere Versionen unterstützen drei SQL-Mode-Modi: ANSI, TRADITIONAL und STRICT_TRANS_TABLES.

1. ANSI-Modus: Lockerer Modus, ändert Syntax und Verhalten, um eine größere Konsistenz mit Standard-SQL zu erreichen. Ü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. Um den am Anfang des Artikels genannten Fehler zu beheben, können Sie zunächst sql_mode auf ANSI-Modus setzen, damit Sie Daten einfügen können und die Feldwerte, die sich aus dem Divisor 0 ergeben, von der Datenbank durch NULL-Werte ersetzt werden.

2. 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 statt nur einer Warnung gemeldet wird. Bei Verwendung für Transaktionen wird die Transaktion zurückgesetzt. Hinweis: Brechen Sie INSERT/UPDATE sofort ab, wenn ein Fehler auftritt. Dies ist nicht erwünscht, wenn Sie eine nicht transaktionale Speicher-Engine verwenden, da Datenänderungen, die vor dem Fehler vorgenommen wurden, nicht „übernommen“ werden, was zu „teilweise ausgeführten“ Aktualisierungen führt.

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. Wenn der angegebene Wert nicht in die Transaktionstabelle eingefügt werden kann, wird die Anweisung abgebrochen. Bei nicht transaktionalen Tabellen wird die Anweisung abgebrochen, wenn der Wert in einer einzeiligen Anweisung oder in Zeile 1 einer mehrzeiligen Anweisung erscheint.

Festlegen des SQL-Modus

Zeigen Sie den SQL-Modus der aktuellen Verbindungssitzung an:

mysql> wähle @@session.sql_mode;

Oder aus der Umgebungsvariable

mysql> Variablen wie „sql_mode“ anzeigen;

Zeigen Sie die globale SQL_Mode-Einstellung an:

mysql> wähle @@global.sql_mode;

Global eingestellt, Sie müssen sich erneut verbinden, damit dies wirksam wird

mysql> globalen SQL-Modus festlegen = "NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE, NO_ZERO_IN_DATE";

Das Festlegen des globalen SQL-Modus kann ohne Neustart von MySQL wirksam werden.

Einstellungen in der Konfigurationsdatei

sql_mode=KEIN_AUTO_CREATE_USER,KEIN_ENGINE_SUBSTITUTION,KEIN_ZERO_DATE,KEIN_ZERO_IN_DATE

Starten Sie den MySQL-Dienst nach dem Ändern der Konfigurationsdatei neu, damit die Änderungen wirksam werden

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Wenn Sie mehr darüber erfahren möchten, schauen Sie sich bitte die folgenden Links an

Das könnte Sie auch interessieren:
  • Gründe und Lösungen für das Nicht-Wirksamwerden der MySQL-SQL-Modus-Änderung
  • Detaillierte Erläuterung der MySQL sql_mode-Abfrage und -Einstellung
  • Detaillierte Erklärung zum Anzeigen und Einstellen des SQL-Modus in MySQL
  • Detaillierte Erläuterung des SQL_Mode-Modusbeispiels in MySQL
  • Django2 stellt eine Verbindung zu MySQL her und analysiert Beispiele für Modelltests
  • Detaillierte Erklärung zu sinnvollen Einstellungen des MySQL sql_mode
  • Die Fallstricke und Lösungen, die durch den Standardwert von sql_mode in MySQL 5.7 verursacht werden
  • Die perfekte Lösung für das MySql-Versionsproblem sql_mode=only_full_group_by
  • 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
  • mysql sql_mode="" Funktionsbeschreibung
  • Detaillierte Erläuterung der Verwendung von MySQL sql_mode

<<:  So verwenden Sie die Zusatzfunktionen von Vuex

>>:  Erfahren Sie in zehn Minuten, wie Sie Microservices mit Docker bereitstellen

Artikel empfehlen

Implementierung des Whack-a-Mole-Spiels in JavaScript

In diesem Artikel finden Sie den spezifischen Cod...

JavaScript implementiert die Eingabeüberprüfung im Kennwortfeld

Manchmal ist es notwendig, bei Benutzereingaben e...

HTML Mehrere spezielle Trennlinieneffekte

1. Grundlinien 2. Spezialeffekte (die Effekte sin...

Einführung in Docker-Container

Docker-Übersicht Docker ist eine Open-Source-Lösu...

Vue implementiert das Hinzufügen von Wasserzeichen zu hochgeladenen Bildern

In diesem Artikel wird der spezifische Implementi...

Grafisches Tutorial zur Installation und Verwendung von MySQL 5.7.17

MySQL ist ein relationales Datenbankverwaltungssy...

Lösung für das Problem des verstümmelten Codes in MySQL 5.x

MySQL ist eine häufig verwendete Open-Source-Date...

Umfassende Erklärung zum CocosCreator Hot Update

Inhaltsverzeichnis Vorwort Was ist Hot Change Coc...

Zeichnen Sie ein Herz mit CSS3

Ergebnisse erzielenAnforderungen/Funktionalität: ...

JS-Prinzip der asynchronen Ausführung und Rückrufdetails

1. JS-Prinzip der asynchronen Ausführung Wir wiss...

vue + ts realisiert den Effekt des Ziehens von Elementen mit der Maus

In diesem Artikelbeispiel wird der spezifische Co...

Methoden und Schritte zum Upgrade von MySql5.x auf MySql8.x

Mehrere Unterschiede zwischen MySQL 5.x und MySQL...