VorwortWir 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. SzenariosimulationAus 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.) ZusammenfassenAnhand 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:
|
>>: So legen Sie den Rahmen einer Webseitentabelle fest
1. readonly Nur-Lese-Attribut, so dass Sie den Wer...
Inhaltsverzeichnis Überblick Code-Implementierung...
Inhaltsverzeichnis Was ist Express-Middleware? Vo...
Vorwort Vor kurzem war ich damit beschäftigt, ein...
Inhaltsverzeichnis 1. Einleitung 2. Vorteile 3. N...
Inhaltsverzeichnis Vorwort - Vue Routing 1. Die g...
Als ich kürzlich Hausaufgaben machte, musste ich e...
1. Der Tomcat-Dienst ist nicht geöffnet Geben Sie...
Wenn bei der Verarbeitung von Batch-Updates besti...
Online-Vorschau https://jsrun.pro/AafKp/ Erster B...
<br />Der Inhalt wurde aus dem Internet repr...
Der Standardbetriebsmodus von MySQL ist der Autoc...
Inhaltsverzeichnis Stil mit Gültigkeitsbereich St...
Heute habe ich einen neuen CSS-Spezialeffekt gele...
1. Im Web unterstützte Bildformate: GIF: kann 256...