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

mysql 8.0.19 winx64.zip Installations-Tutorial

Dieser Artikel zeichnet das Installationstutorial...

Einstellungen für den Ubuntu-Boot-Autostart-Dienst

So erstellen Sie einen Dienst und starten ihn aut...

So installieren Sie den Chrome-Browser auf CentOS 7

Dieser Artikel beschreibt, wie Sie den Chrome-Bro...

Eine sehr detaillierte Erklärung der Linux C++ Multi-Thread-Synchronisierung

Inhaltsverzeichnis 1. Mutex 1. Initialisierung de...

Referenz zur Webseitenerstellung im IE6 - Standardstil im IE6

Dies ist eigentlich kein offizielles Dokument des ...

So kompilieren und installieren Sie OpenCV unter Ubuntu

Einfache Installation von opencv2: conda installi...

Warum MySQL das Löschen von Daten nicht empfiehlt

Inhaltsverzeichnis Vorwort InnoDB-Speicherarchite...

Einige Details zu MySQL-Indizes

Vor ein paar Tagen stellte mir ein Kollege eine F...

Die neueste Installations- und Konfigurationsmethode für MySQL-5.7.21

1. Entpacken Sie das heruntergeladene MySQL-Kompr...

Detaillierte Erklärung unsichtbarer Indizes in MySQL 8.0

Wort Seit der ersten Version von MySQL 8.0 liegen...

Sollte ich für das mobile Web-WAP Bootstrap oder jQuery Mobile verwenden?

Lösung des Problems Bootstrap ist ein CSS-Framewo...

Beispiel für die Konvertierung eines Zeitstempels in ein Datum in MySQL

Vorwort Ich bin bei der Arbeit auf folgende Situa...

5 JavaScript-Möglichkeiten zum Abflachen von Arrays

Inhaltsverzeichnis 1. Konzept der Array-Abflachun...

CentOS 6-7 Yum-Installationsmethode für PHP (empfohlen)

1. Überprüfen Sie die aktuell installierten PHP-P...

Über React Native, das keine Verbindung zum Simulator herstellen kann

React Native kann native iOS- und Android-Apps ba...