Detaillierte Erläuterung des SQL_Mode-Modusbeispiels in MySQL

Detaillierte Erläuterung des SQL_Mode-Modusbeispiels in MySQL

Dieser Artikel beschreibt den SQL_Mode-Modus in MySQL anhand von Beispielen. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

In der MySQL-Datenbank gibt es eine Umgebungsvariable sql_mode, die die SQL-Syntax, Datenvalidierung usw. definiert, die MySQL unterstützen soll! Wir können den von der aktuellen Datenbank verwendeten SQL-Modus auf folgende Arten anzeigen:

mysql> wähle @@sql_mode;
+----------------------------------------------------------------+
| @@sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES, KEIN_AUTO_CREATE_USER, KEIN_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+

MySQL 5.0 und höhere Versionen unterstützen drei sql_mode-Modi

ANSI-Modus

Im Loose-Modus werden die eingefügten Daten geprüft. Entsprechen sie nicht dem definierten Typ oder der Länge, wird der Datentyp vor dem Speichern angepasst bzw. gekürzt und eine Warnung ausgegeben.

TRADITIONAL-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.

STRICT_TRANS_TABLES-Modus

Im strikten Modus wird eine strenge Datenüberprüfung durchgeführt. Falsche Daten können nicht eingegeben werden und es wird ein Fehler gemeldet.

1 ANSI-Modus

Wenn wir im ANSI-Modus Daten einfügen und die Spaltenlängenanforderung nicht erfüllt ist, werden die Daten erfolgreich eingefügt, aber die Felder, die die Spaltenlänge überschreiten, werden abgeschnitten und es wird eine Warnung ausgegeben.

mysql> setze @@sql_mode=ANSI;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> Tabelle erstellen Test (Name varchar (4), Pass varchar (4));
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)
mysql> in Testwerte einfügen('aaaaa','aaaaa'),('bbbb','bbbb');
Abfrage OK, 2 Zeilen betroffen, 2 Warnungen (0,02 Sek.)
Datensätze: 2 Duplikate: 0 Warnungen: 2
mysql> Warnungen anzeigen;
+---------+------+------------------------------------------+
| Ebene | Code | Nachricht |
+---------+------+------------------------------------------+
| Warnung | 1265 | Daten für Spalte „Name“ in Zeile 1 abgeschnitten |
| Warnung | 1265 | Daten für Spalte „pass“ in Zeile 1 abgeschnitten |
+---------+------+------------------------------------------+
2 Zeilen im Satz (0,00 Sek.)
mysql> wähle * aus Test;
+------+------+
| Name | Passwort |
+------+------+
| aaaa | aaaa |
| bbbb | bbbb |
+------+------+
2 Zeilen im Satz (0,00 Sek.)

2 STRICT_TRANS_TABLES-Modus

Im STRICT_TRANS_TABLES-Modus überprüft MySQL die Daten streng, wenn wir Daten einfügen. Wenn festgestellt wird, dass der eingefügte Spaltenwert die Anforderungen nicht erfüllt, wird direkt ein Fehler gemeldet, um sicherzustellen, dass die falschen Daten nicht in die Datenbank eingefügt werden können.

mysql> setze @@sql_mode=STRICT_TRANS_TABLES;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> Tabelle erstellen Test (Name varchar (4), Pass varchar (4));
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
mysql> in Testwerte einfügen('aaaaa','aaaaa'),('bbbb','bbbb');
FEHLER 1406 (22001): Daten zu lang für Spalte „Name“ in Zeile 1
mysql> Fehler anzeigen;
+-------+------+------------------------------------------+
| Ebene | Code | Nachricht |
+-------+------+------------------------------------------+
| Fehler | 1406 | Daten für Spalte „Name“ in Zeile 1 zu lang |
+-------+------+------------------------------------------+
1 Zeile im Satz (0,00 Sek.)
mysql> wähle * aus Test;
Leerer Satz (0,00 Sek.)

3 TRADITIONELLER Modus, schauen Sie zuerst, ob die Ergebnisse gleich sind

mysql> setze @@sql_mode=TRADITIONAL;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> Tabelle erstellen Test (Name varchar (4), Pass varchar (4));
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
mysql> in Testwerte einfügen('aaaaa','aaaaa'),('bbbb','bbbb');
FEHLER 1406 (22001): Daten zu lang für Spalte „Name“ in Zeile 1
mysql> Fehler anzeigen;
+-------+------+------------------------------------------+
| Ebene | Code | Nachricht |
+-------+------+------------------------------------------+
| Fehler | 1406 | Daten für Spalte „Name“ in Zeile 1 zu lang |
+-------+------+------------------------------------------+
1 Zeile im Satz (0,00 Sek.)
mysql> wähle * aus Test;
Leerer Satz (0,00 Sek.)

Sie können jedoch sehen, was nach dem Einstellen passiert

mysql> setze @@sql_mode=TRADITIONAL;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> wähle @@sql_mode\G
*************************** 1. Reihe ***************************
@@sql_mode: STRICT_TRANS_TABLES, STRICT_ALL_TABLES, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, TRADITIONELL, KEIN_AUTO_CREATE_USER, KEIN_ENGINE_SUBSTITUTION
1 Zeile im Satz (0,00 Sek.)

Im TRADITIONAL-Modus werden alle transaktionalen und nicht transaktionalen Speicher-Engines geprüft. Die Monats- und Tagesteile des Datumstyps dürfen keine 0 enthalten, es darf kein Datum wie 0 (0000-00-00) geben, die Daten können nicht durch 0 geteilt werden und die automatische Erstellung neuer Benutzer ist nicht zulässig.

endlich:

set @@ wird nur auf Sitzungsebene gesetzt. Wenn Sie möchten, dass alles wirksam wird, müssen Sie noch die Konfigurationsdatei setzen

vi /etc/meine.cnf

Fügen Sie unter [mysqld] die folgende Zeile hinzu:

sql_mode=KEIN_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

#NO_ENGINE_SUBSTITUTION meldet einen Fehler für eine nicht vorhandene Engine. Wenn es nicht hinzugefügt wird, wird bei der Angabe einer nicht unterstützten Engine der Standard-Innodb angegeben.

Darüber hinaus verfügt sql_mode auch über eine Konfiguration ONLY_FULL_GROUP_BY, was bedeutet, dass beim Auswählen von Daten mithilfe von „Group By“ nur die Informationen in der neuen Gruppe angezeigt werden können.

Vorgänge vor dem Ändern des Modus

mysql> select * aus Mitarbeitergruppe nach Post;
+----+--------+--------+-----+------------+-----------------------------------------+---------------+-------------+--------+-----------+
| ID | Name | Geschlecht | Alter | Einstellungsdatum | Post | Post-Kommentar | Gehalt | Büro | Abreise-ID |
+----+--------+--------+-----+------------+-----------------------------------------+---------------+-------------+--------+-----------+
| 14 | Zhang Ye | männlich | 28 | 11.03.2016 | Vorgang | NULL | 10000,13 | 403 | 3 |
| 9 | 歪歪| weiblich | 48 | 11.03.2015 | Verkauf | NULL | 3000,13 | 402 | 2 |
| 2 | Alex | männlich | 78 | 02.03.2015 | Lehrer | NULL | 1000000,31 | 401 | 1 |
| 1 | egon | männlich | 18 | 01.03.2017 | Botschafter des Old Boy's Office in Shahe | NULL | 7300,33 | 401 | 1 |
+----+--------+--------+-----+------------+-----------------------------------------+---------------+-------------+--------+-----------+
4 Zeilen im Satz (0,00 Sek.)

Zu diesem Zeitpunkt sql_mode:

mysql> wähle @@sql_mode;
+----------------------------------------------------------------+
| @@sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES, KEIN_AUTO_CREATE_USER, KEIN_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

Ändern Sie es, beenden Sie es und geben Sie es dann erneut ein, damit es wirksam wird

mysql> globalen SQL-Modus festlegen = 'STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION, ONLY_FULL_GROUP_BY';
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> wähle @@sql_mode;
+----------------------------------------------------------------+
| @@sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES, KEIN_AUTO_CREATE_USER, KEIN_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)
mysql> beenden
Tschüss

Erneut eingeben

mysql> wähle @@sql_mode;
+-----------------------------------------------------------------------------------+
| @@sql_mode |
+-----------------------------------------------------------------------------------+
| NUR_VOLLSTÄNDIGE_GROUP_BY, STRENGE_TRANS_TABLES, KEIN_AUTOMATISCHES_ERSTELLEN_BENUTZER, KEIN_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

Die geänderten Ergebnisse finden Sie weiter unten.

mysql> select * from employee group by post; //Nur Beiträge können angezeigt werden
FEHLER 1055 (42000): „t1.employee.id“ ist nicht in GROUP BY
mysql> Beitrag aus Mitarbeitergruppe nach Beitrag auswählen;
+-----------------------------------------+
| veröffentlichen |
+-----------------------------------------+
| Betrieb |
| Verkauf |
| Lehrer |
| Diplomatischer Botschafter des Old Boys Office in Shahe |
+-----------------------------------------+
4 Zeilen im Satz (0,00 Sek.)
mysql> wähle ID, Post aus der Mitarbeitergruppe nach Post;
FEHLER 1055 (42000): „t1.employee.id“ ist nicht in GROUP BY
mysql> select name,post from employee group by post,name; //Anzeige entsprechend der Auswahl nach group by +------------+-----------------------------------------+
| Name | Beitrag |
+------------+-----------------------------------------------------+
| Zhang Ye| Betrieb |
| Cheng Yaojin | Betrieb |
| Cheng Yaotie | Betrieb |
| Cheng Yaotong | Betrieb |
| Cheng Yaoyin | Betrieb |
| Ding Ding | Verkauf |
| Yaya | Verkauf |
| Sterne | Ausverkauf |
| Gege | Verkauf |
| Wai Wai | Verkauf |
| Alex | Lehrer |
| Jingliyang | Lehrer |
| Jinxin | Lehrer |
| Liwenzhou | Lehrer |
| Wupeiqi | Lehrer |
| xiaomage | Lehrer |
| Yuanhao | Lehrer |
| Egon | Diplomatischer Botschafter des Old Boys Office in Shahe |
+------------+-----------------------------------------------------+
18 Zeilen im Satz (0,00 Sek.)

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „MySQL-Abfragekenntnisse“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „MySQL-Protokolloperationskenntnisse“, „Zusammenfassung der MySQL-Transaktionsoperationskenntnisse“, „MySQL-gespeicherte Prozedurkenntnisse“ und „Zusammenfassung der MySQL-Datenbanksperrenkenntnisse“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

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
  • Django2 stellt eine Verbindung zu MySQL her und analysiert Beispiele für Modelltests
  • Detaillierte Erklärung zu sinnvollen Einstellungen des MySQL sql_mode
  • 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
  • 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

<<:  Analyse des Tutorials zur Implementierung der Remote-Anmeldung unter Linux

>>:  Natives JS zum Erzielen eines coolen Paging-Effekts

Artikel empfehlen

Beheben Sie den abnormalen Fehler beim Erstellen einer Vue-Umgebung mit Webpack

Inhaltsverzeichnis Konfigurieren Sie zuerst packa...

Detaillierte Erläuterung der Verwendung des Linux-Befehls seq

01. Befehlsübersicht Der Befehl „seq“ wird verwen...

mysql5.6.zip-Format komprimierte Version Installations-Grafik-Tutorial

Vorwort: MySQL ist ein relationales Datenbankverw...

So installieren Sie Windows Server 2008 R2 auf einem Dell R720-Server

Hinweis: Alle Bilder in diesem Artikel stammen au...

Textmodus im IE! Einführung in die Rolle von DOCTYPE

Nachdem das im vorherigen Artikel besprochene Prob...

CSS löst das Fehlausrichtungsproblem von Inline-Blöcken

Schluss mit Unsinn, Postleitzahl HTML-Teil <di...

Lösungen für das Problem der Tabellenschachtelung und Rahmenzusammenführung

【Frage】 Wenn die äußere und die innere Tabelle ve...

VPS erstellt Offline-Download-Server (nach der Ära der Netzwerkfestplatten)

Motivation Aus Lerngründen habe ich einen VPS-Die...

JavaScript verwendet Promise zur Verarbeitung mehrerer wiederholter Anfragen

1. Warum diesen Artikel schreiben? Sie haben sich...

Asynchrone Programmierung in Javascript: Verstehen Sie Promise wirklich?

Inhaltsverzeichnis Vorwort Grundlegende Verwendun...

Sie müssen wirklich die Verwendung von CSS-Variablen var() verstehen

Wenn ein Webprojekt immer größer wird, werden sei...