Gründe und Lösungen für das Nicht-Wirksamwerden der MySQL-SQL-Modus-Änderung

Gründe und Lösungen für das Nicht-Wirksamwerden der MySQL-SQL-Modus-Änderung

Vorwort

Wir haben in letzter Zeit oft über das Thema sql_mode gesprochen und sind dabei oft auf damit verbundene Probleme gestoßen. Heute werde ich das Eisen schmieden, solange es heiß ist, und Ihnen eine weitere Fallstudie zu sql_mode vorstellen.

Szenariosimulation

Aus Gründen der Geschäftsvertraulichkeit handelt es sich bei den unten aufgeführten Tabellen und gespeicherten Prozeduren nicht um echte Daten. Dies hat jedoch keinen Einfluss auf den Fehlerbehebungsprozess.

(1) Der Client-Entwickler hat eine gespeicherte Prozedur erstellt, die nicht strikt der Standard-Gruppierungssyntax folgte.

Sitzung 1:
mysql> Trennzeichen //

mysql> Prozedur test_for_group_by() erstellen
    -> beginnen
    -> wähle k, pad, count(*) aus test.test-Gruppe nach k;
    -> Ende //
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

mysql> Trennzeichen;

(2) Der Client-Entwickler ruft die gespeicherte Prozedur auf und meldet FEHLER 1140. Da die gespeicherte Prozedur komplex und schwer zu ändern war, entscheidet sich der Client, sql_mode zu ändern.

Sitzung 1:
mysql> rufe test_for_group_by() auf;
FEHLER 1140 (42000): In einer aggregierten Abfrage ohne GROUP BY enthält Ausdruck Nr. 1 der SELECT-Liste die nicht aggregierte Spalte „test.test.k“. Dies ist nicht kompatibel mit sql_mode=only_full_group_by.

(3) Nachdem der Client den SQL-Modus geändert und erneut ausgeführt hat, wird immer noch FEHLER 1140 gemeldet

Sitzung 2:
mysql> globalen SQL-Modus festlegen = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION';
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Sitzung 1:
mysql> rufe test_for_group_by() auf;
FEHLER 1140 (42000): In einer aggregierten Abfrage ohne GROUP BY enthält Ausdruck Nr. 1 der SELECT-Liste die nicht aggregierte Spalte „test.test.k“. Dies ist nicht kompatibel mit sql_mode=only_full_group_by.

(4) An diesem Punkt wurde mir klar, dass das Ändern der Systemvariablen nur bei neuen Verbindungen wirksam ist, nicht bei bestehenden Verbindungen. Ich forderte den Client also auf, die Verbindung erneut herzustellen, zu bestätigen, dass die Systemvariablen wirksam geworden sind, und die gespeicherte Prozedur erneut aufzurufen, aber die Fehlermeldung ERROR 1140 wurde immer noch angezeigt. Ich versuchte es mehrmals und erhielt das gleiche Ergebnis.

Sitzung 3:
mysql> Variablen wie „sql_mode“ anzeigen;
+------------------+----------------------------------------------------------------------------------------------------------+
| Variablenname | Wert |
+------------------+----------------------------------------------------------------------------------------------------------+
| SQL-Modus | STRICT_TRANS_TABLES,KEINE_NULL_IM_DATUM,KEIN_NULL_DATUM,FEHLER_FÜR_DIVISION_DURCH_NULL,KEIN_AUTO_CREATE_USER,KEIN_ENGINE_SUBSTITUTION |
+------------------+----------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,01 Sek.)

mysql> rufe test_for_group_by() auf;
FEHLER 1140 (42000): In einer aggregierten Abfrage ohne GROUP BY enthält Ausdruck Nr. 1 der SELECT-Liste die nicht aggregierte Spalte „test.test.k“. Dies ist nicht kompatibel mit sql_mode=only_full_group_by.

(5) Weitere Untersuchungen wurden durchgeführt, indem der Client aufgefordert wurde, in der Sitzung eine nicht standardmäßige „Group By“-Anweisung auszuführen. Es wurde festgestellt, dass die Anweisung normal ausgeführt werden konnte.

Sitzung 3:
mysql> select user,host,count(*) Aus mysql.user-Gruppe nach Benutzer;
+--------------+--------------+----------+
| Benutzer | Host | Anzahl(*) |
+--------------+--------------+----------+
| mysql.session | lokaler Host | 1 |
| mysql.sys | lokaler Host | 1 |
| Stammverzeichnis | lokaler Host | 1 |
| % | 1 |
| Prüfung | % | 1 |
+--------------+--------------+----------+
5 Zeilen im Satz (0,00 Sek.)

(6) Bei der weiteren Untersuchung stellten wir fest, dass der SQL-Modus der gespeicherten Prozedur immer noch ONLY_FULL_GROUP_BY enthielt, sodass die Ausführung einen Fehler meldete.

Sitzung 2:
mysql> wähle Routine_Katalog, Routine_Schema, Routine_Name, Routine_Typ, erstellt, zuletzt_geändert, SQL_Modus aus Routinen, bei denen Routine_Name = "Test_für_Gruppe_by";
+-----------------+----------------+------------------+--------------+---------------------+---------------------+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| Routinenkatalog | Routinenschema | Routinenname | Routinentyp | erstellt | zuletzt geändert | SQL-Modus |
+-----------------+----------------+------------------+--------------+---------------------+---------------------+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| def | Test | Test für Group_by | VERFAHREN | 24.12.2020 12:12:10 | 24.12.2020 12:12:10 | NUR_VOLLSTÄNDIGE_GROUP_BY, STRENGE_TRANS_TABLES, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEIN_AUTOMATISCHES_ERSTELLEN_BENUTZER, KEINE_ENGINE_SUBSTITUTION |
+-----------------+----------------+------------------+--------------+---------------------+---------------------+---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

(7) Hier können wir auch erkennen, dass die Änderung der Systemvariablen nur für neu erstellte Objekte wirksam ist, nicht für vorhandene Objekte. Die Lösung ist sehr einfach: Erstellen Sie einfach die gespeicherte Prozedur neu.

Sitzung 3:
mysql> Prozedur test_for_group_by löschen;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

mysql> Trennzeichen //

mysql> Prozedur test_for_group_by() erstellen
    -> beginnen
    -> wähle k, pad, count(*) aus test.test-Gruppe nach k;
    -> Ende //
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

mysql> Trennzeichen;

mysql> rufe test_for_group_by() auf;
+--------+--------------------------------------------------------------+----------+
| k | auffüllen | Anzahl(*) |
+--------+--------------------------------------------------------------+----------+
| 393975 | 35227182905-15234265621-59793845249-15413569710-23749555118 | 1 |
| 495688 | 09512147864-77936258834-40901700703-13541171421-15205431759 | 1 |
| 497896 | 13152283289-69561545685-52868757241-04245213425-69280254356 | 1 |
| 498573 | 43131080328-59298106536-35954612339-97546855884-75769514803 | 1 |
| 500775 | 27590239742-20204899609-34345212327-79811525340-24267764271 | 1 |
| 501885 | 63188288836-92351140030-06390587585-66802097351-49282961843 | 1 |
| 503330 | 01495266405-82925129145-92643983850-90243995398-18709399387 | 1 |
| 503666 | 40929980986-33813039690-13155419391-97985458477-39771362212 | 1 |
| 504353 | 00505722282-72931248925-57037623248-81117963809-88658076981 | 1 |
| 514246 | 21979564480-87492594656-60524686334-78820761788-57684966682 | 1 |
+--------+--------------------------------------------------------------+----------+
10 Zeilen im Satz (0,00 Sek.)

Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Zusammenfassen

Anhand dieses Falls können wir erkennen, dass die Änderung der Systemvariablen sql_mode nur für neu erstellte Verbindungen und neu erstellte Objekte (hauptsächlich Funktionen und gespeicherte Prozeduren) wirksam ist, nicht jedoch für vorhandene Verbindungen und vorhandene Objekte.

Oben finden Sie ausführliche Informationen zu den Gründen, warum MySQL-SQL-Modus-Änderungen nicht wirksam werden, sowie zu den Lösungen. Weitere Informationen zu MySQL-SQL-Modus-Änderungen, die nicht wirksam werden, finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • 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
  • 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

<<:  Implementieren Sie eine MaterialUI-Button-Klickanimation auf Basis von CSS und kapseln Sie sie in eine React-Komponente ein.

>>:  So legen Sie den Rahmen einer Webseitentabelle fest

Artikel empfehlen

JavaScript-Entwurfsmuster, Lernadaptermuster

Inhaltsverzeichnis Überblick Code-Implementierung...

Detaillierte Erklärung der Funktionsweise der Node.js-Middleware

Inhaltsverzeichnis Was ist Express-Middleware? Vo...

Detaillierte Erläuterung des Vuex-Gesamtfalls

Inhaltsverzeichnis 1. Einleitung 2. Vorteile 3. N...

Tiefgreifendes Verständnis der Vue-cli4-Routing-Konfiguration

Inhaltsverzeichnis Vorwort - Vue Routing 1. Die g...

Div verschachteltes HTML ohne Iframe

Als ich kürzlich Hausaufgaben machte, musste ich e...

Einführung in mögliche Probleme nach der Installation von Tomcat

1. Der Tomcat-Dienst ist nicht geöffnet Geben Sie...

MySQL-Update-Fall Update-Feldwert ist keine feste Operation

Wenn bei der Verarbeitung von Batch-Updates besti...

Beispiel für die Implementierung von QR-Code-Scaneffekten mit CSS3

Online-Vorschau https://jsrun.pro/AafKp/ Erster B...

Hilfe zum Webdesign: Datenreferenz für Web-Schriftgrößen

<br />Der Inhalt wurde aus dem Internet repr...

Automatischer Commit-Vorgang für MySQL-Transaktionen

Der Standardbetriebsmodus von MySQL ist der Autoc...

Ausführliche Erläuterung der Stilfunktion in Vue3-Einzeldateikomponenten

Inhaltsverzeichnis Stil mit Gültigkeitsbereich St...

Beispielcode zur Implementierung des wellenförmigen Wasserballeffekts mit CSS

Heute habe ich einen neuen CSS-Spezialeffekt gele...

So fügen Sie Bilder in HTML-Seiten ein und fügen Kartenindexbeispiele hinzu

1. Im Web unterstützte Bildformate: GIF: kann 256...