Deaktivieren Sie ONLY_FULL_GROUP_BY

614

Ich habe versehentlich den ONLY_FULL_GROUP_BY-Modus wie folgt aktiviert:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Wie deaktiviere ich es?

ZviBar
quelle
38
Hast du es versucht SET sql_mode = ''?
Tripp Kinetics
4
Warum sollten Sie einen Modus deaktivieren, mit dem MySQL den SQL-Standards besser entspricht, und einen, der Sie lehrt, beim Schreiben Ihrer Abfragen vorsichtiger zu sein?
Andriy M
34
Ab MySQL 5.7 können Sie alternativ die columnFunktion ANY_VALUE ( ) verwenden, um Ihre Abfrage nachzurüsten. Siehe Dokument hier
Qoheleth-Tech
3
@AndriyM Ich muss dies bald verwenden, da ich eine ganze Menge alter Anwendungen auf einen neuen Server portiere und sie funktionieren müssen, unabhängig davon, ob ich die Quelle habe oder nicht.
Jaydee
8
@AndriyM Denn wenn ich nach einer eindeutigen Indexspalte gruppiere, weiß ich BEREITS, dass jede Zeile eindeutig ist - indem ich für jede Zeile eine separate Gruppe per Befehl hinzufüge. Single. Säule. in der Tabelle ist ein königlicher Schmerz.
Benubird

Antworten:

1163

Lösung 1: Entfernen Sie ONLY_FULL_GROUP_BY von der MySQL-Konsole

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Sie können hier mehr lesen

Lösung 2: Entfernen Sie ONLY_FULL_GROUP_BY aus phpmyadmin

  • Öffnen Sie phpmyadmin und wählen Sie localhost aus
  • Klicken Sie auf das Menü Variablen und scrollen Sie für den SQL-Modus nach unten
  • Klicken Sie auf die Schaltfläche Bearbeiten, um die Werte zu ändern, ONLY_FULL_GROUP_BY zu entfernen und auf Speichern zu klicken. Geben Sie hier die Bildbeschreibung ein
Eyo Okon Eyo
quelle
12
Diese Lösung funktioniert gut unter mySQL 5.7.11 und sollte akzeptiert werden. Die akzeptierte Antwort funktioniert nicht auf der neuen Version von mySQL
Anyone_ph
4
Nur sichergestellt. Es spielt keine Rolle REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), MySQL entfernt sowieso unerwünschte Kommas aus dem Datensatz. Die Antwort von OP ist richtig.
Nawfal
40
Dies funktioniert, aber wenn ich den MySQL-Server neu starte, werden die Standardeinstellungen wiederhergestellt ... warum? Gibt es eine dauerhafte Lösung? Vielen Dank!
Vincent Pazeller
52
Um meine Frage zu beantworten (dauerhafte Lösung): Sie müssen die Beschreibung von sql_mode in eine my.cnf-Datei (z. B. /etc/my.cnf) einfügen und den Server neu starten. Zum Beispiel Einsatz (unter dem Abschnitt [mysqld]) sql_mode = "STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Vincent Pazeller
21
GLOBALhat bei mir nicht funktioniert, aber SESSIONfunktioniert. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre
371

Aktualisieren:

Geben Sie hier die Bildbeschreibung ein

Um Ihre aktuellen MySQL-Einstellungen ONLY_FULL_GROUP_BYbeizubehalten und zu deaktivieren, empfehle ich, Ihren phpmyadmin oder den von Ihnen verwendeten Client zu besuchen und Folgendes einzugeben:

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me

nächstes Kopierergebnis in Ihre my.iniDatei.

Minze :sudo nano /etc/mysql/my.cnf

Ubuntu 16 und höher :sudo nano /etc/mysql/my.cnf

Ubuntu 14-16 :/etc/mysql/mysql.conf.d/mysqld.cnf

Vorsicht! copy_meDas Ergebnis kann einen langen Text enthalten, der möglicherweise standardmäßig gekürzt wird. Stellen Sie sicher, dass Sie den gesamten Text kopieren!


alte Antwort:

Wenn Sie den Fehler dauerhaft deaktivieren möchten "Der Ausdruck #N der SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte 'db.table.COL', die funktional nicht von den Spalten in der GROUP BY-Klausel abhängig ist. Dies ist nicht kompatibel mit sql_mode = only_full_group_by "Machen Sie diese Schritte:

  1. sudo nano /etc/mysql/my.cnf
  2. Fügen Sie dies am Ende der Datei hinzu

    [mysqld]  
    sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  3. sudo service mysql restart um MySQL neu zu starten

Dies wird ONLY_FULL_GROUP_BYfür ALLE Benutzer deaktiviert

breq
quelle
2
Für mich hat das Setzen des mysqld-Tags in derselben Zeile nicht funktioniert, aber es hat mit einem Zeilenumbruch funktioniert :) danke
bloub
23
Für Ubuntu ist die Datei, in die benutzerdefinierte Konfigurationswerte gehen/etc/mysql/mysql.conf.d/mysqld.cnf
knb
5
Dies funktionierte für Ubuntu 16.04 (14 bis 16 Upgrade-Probleme ..). Die Datei /etc/mysql/my.cnf ist die richtige Datei. Die von knb erwähnte Datei ist mindestens in 16.04 in dieser my.cnf-Datei enthalten (die Konfiguration ist jetzt in mehrere Dateien aufgeteilt).
jwinn
2
Verwenden Sie "SELECT @@ sql_mode;" um zu sehen, welche Modi aktuell aktiviert sind, bevor Sie Änderungen vornehmen.
Zbigniew Ledwoń
1
Der tatsächliche Ort, an dem Sie sehen, befindet sich [mysqld]möglicherweise nicht in dieser Datei, sondern möglicherweise in einem Include-Verzeichnis. Verwenden Sie zuerst diesen Befehl: um grep -R "\[mysqld\]" *zu sehen, was da ist - und versuchen Sie es auchgrep -R "\bsql_mode\b" *
Oliver Williams
203

Seien Sie vorsichtig mit

SET sql_mode = '' 

Dadurch werden alle derzeit aktivierten Modi gelöscht. Wenn Sie sich nicht mit anderen Einstellungen anlegen möchten, sollten Sie eine

SELECT @@sql_mode 

Um zuerst eine durch Kommas getrennte Liste der aktivierten Modi zu erhalten, setzen Sie sie dann ohne die ONLY_FULL_GROUP_BYOption auf diese Liste .

Taran
quelle
Was ist der beste Weg, um dies zu tun : then SET it to this list without the ONLY_FULL_GROUP_BY option.?
Kevin Meredith
4
@KevinMeredith meine Lektüre der Dokumente gibt es keine Möglichkeit , einen Modus zu aktivieren / zu einer Zeit aus - alle Beispiele benötigen Sie eine durch Kommata getrennte Liste von denen , liefern Sie wollen - zBSET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
William Turrell
1
Wenn dies eine dauerhafte Änderung ist, bearbeiten Sie my.cnf mit einer Zeile wie folgt: sql_mode=<comma-separated-list>Stoppen Sie dann Ihren Server und starten Sie ihn. Befolgen Sie die Dokumente für Ihr Betriebssystem, um den Speicherort und die beste Methode zum Bearbeiten von my.cnf zu ermitteln.
Blackwood
107

Probieren Sie es aus:

SET sql_mode = ''

Community-Hinweis: Wie in den folgenden Antworten ausgeführt, werden alle derzeit aktivierten SQL-Modi gelöscht. Das muss nicht unbedingt das sein, was Sie wollen.

Tripp Kinetics
quelle
11
Wow, ''= 'full group by is disabled'? MySQL macht einige ziemlich dumme Sachen, aber diese ist da oben.
Aaron Bertrand
38
Ich denke, dies deaktiviert grundsätzlich jeden SQL-Modus;
ZviBar
Das hat bei mir nicht funktioniert. Ich sehe 0 rows affectedund meine Abfrage funktioniert immer noch nicht:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber
10
Bevor Sie diese Antwort versuchen, lesen Sie unbedingt die Warnung von Machavity. Wenn Sie möchten, dass die Änderungen beibehalten werden , stellen Sie sicher, dass Sie sie globalim Befehl verwenden .
Thomas88wp
6
Jedes Mal, wenn ich nach einiger Zeit zu MySql zurückkomme, stoße ich auf dieses Problem, das mich nervt, weil ich immer vergesse, was das Problem ist :) Das Gefühl ist nur enttäuschend, wenn man denkt, dass es funktioniert hat und jetzt nicht wegen Versionsänderung.
X-HuMan
106
    mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> exit;
WeiYuan
quelle
@ RémiBreton: Was ist deine MySQL-Version?
WeiYuan
6
Das funktioniert tatsächlich. Aber nachdem ich mein System neu gestartet habe (Ubuntu 16.04), wird der sql_modeRollback auf den vorherigen Wert durchgeführt. Was kann ich jetzt machen?
pktangyue
Super, hat für mich gearbeitet, nur ich muss das dauerhaft umwandeln
Fernando Torres
74

Hinzufügen nur eines Modus zu sql_mode, ohne vorhandene zu entfernen:

SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

Entfernen nur eines bestimmten Modus aus sql_mode, ohne andere zu entfernen:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));

Wenn Sie in Ihrem Fall nur den ONLY_FULL_GROUP_BYModus entfernen möchten , verwenden Sie den folgenden Befehl:

SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

Referenz: http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html

Janaka R Rajapaksha
quelle
Das ist eine großartige Antwort! Vielen Dank.
Mi
1
Ist das global oder auf der aktuellen Verbindung? Gute Antwort!
Oliver M Grech
48

Vielen Dank an @cwhisperer. Ich hatte das gleiche Problem mit Doctrine in einer Symfony-App. Ich habe gerade die Option zu meiner config.yml hinzugefügt:

doctrine:
    dbal:
        driver:   pdo_mysql
        options:
            # PDO::MYSQL_ATTR_INIT_COMMAND
            1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

Das hat bei mir gut funktioniert.

Arvid
quelle
1
Wenn Sie mit SET NAMES 'utf8' kombinieren müssen, verwenden Sie Folgendes: "SET NAMES 'utf8', sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));". Wenn stattdessen zwei Abfragen wie "SET NAMES 'utf8'; SET sql_mod ..." verwendet werden, wird "Allgemeiner Fehler: 2014 Abfragen können nicht ausgeführt werden, solange andere ungepufferte Abfragen aktiv sind."
Ventzy Kunev
@VentzyKunev Bitte folgen Sie diesen Ratschlägen nicht und setzen Sie sie nicht SET NAMESmit dieser Methode. In den meisten Fällen wird sie nicht benötigt. Symfony wird bereits über doi.dbal.charset festgelegt SET NAMES ist eine veraltete Methode, die nicht für PHP-Versionen größer als 5.3 verwendet werden sollte
LPodolski
39

Auf:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16 für Linux (x86_64) mit EditLine-Wrapper

Tun:

$ sudo nano /etc/mysql/conf.d/mysql.cnf

Kopieren und Einfügen:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Zum Ende der Datei

$ sudo service mysql restart
Jadeye
quelle
Wird die Datei mysql.cnf niemals durch ein MySQL-Update überschrieben?
Whisperer
1
@cwhisperer /etc/mysql/mysql.cnfzeigt auf 2 Konfigurationsordner !includedir /etc/mysql/conf.d/+ !includedir /etc/mysql/mysql.conf.d/. Gleiches gilt für /etc/mysql/my.cnf. Daher gehe ich davon aus, dass Konfigurationsdateien beim Update nicht überschrieben werden. Sie können mehr hier lesenhttp://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye
Ich habe es versucht und es hat unter Ubuntu 18.04.2 bionic nicht funktioniert. Ich folgte dem und es funktionierte: sitepoint.com/… - vielleicht ist es wichtig, dieses Format mit Leerzeichen und Anführungszeichen zu verwenden: sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"vielleicht ist es wichtig, /etc/mysql/mysql.conf.d/mysqld_mode.cnfstattdessen eine neue Datei zu erstellen
rubo77
Dies funktioniert auch nach dem Neustart des MySQL-Servers
Akshay Khale
36

Ich habe festgestellt, dass die @ Eyo Okon Eyo-Lösung funktioniert, solange der MySQL-Server nicht neu gestartet wird und die Standardeinstellungen wiederhergestellt werden. Hier ist eine dauerhafte Lösung, die für mich funktioniert hat:

So entfernen Sie einen bestimmten SQL-Modus (in diesem Fall ONLY_FULL_GROUP_BY ): Suchen Sie den aktuellen SQL-Modus:

SELECT @@GLOBAL.sql_mode;

Kopieren Sie das Ergebnis und entfernen Sie das, was Sie nicht benötigen ( ONLY_FULL_GROUP_BY ).

z.B:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

zu

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Erstellen und öffnen Sie diese Datei:

/etc/mysql/conf.d/disable_strict_mode.cnf

und schreiben und fügen Sie Ihren neuen SQL-Modus ein:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Starten Sie MySQL neu:

sudo service mysql restart

Oder Sie können die ANY_VALUE()Unterdrückung von ONLY_FULL_GROUP_BY-Werten unterdrücken. Weitere Informationen finden Sie hier

Waqleh
quelle
3
Bis zuANY_VALUE()
Sithu
25

In der MySQL-Dokumentation werden außerdem die folgenden Methoden angegeben:

  • Stellen Sie sql-mode="<modes>"in einer Optionsdatei wie my.cnf (Unix - Betriebssysteme) oder my.ini (Windows).
  • Verwenden Sie die --sql-mode="<modes>"Option, um den SQL-Modus beim Serverstart über die Befehlszeile festzulegen.

* Wo <modes>ist eine Liste von verschiedenen Modi durch Kommas getrennt.

Um den SQL-Modus explizit zu löschen, setzen Sie ihn in --sql-mode=""der Befehlszeile oder sql-mode=""in einer Optionsdatei auf eine leere Zeichenfolge .

Ich habe die sql-mode=""Option hinzugefügt /etc/my.cnfund es hat funktioniert.

Diese SO-Lösung beschreibt Möglichkeiten, um herauszufinden, welche my.cnf-Datei von MySQL verwendet wird.

Vergessen Sie nicht, MySQL nach Änderungen neu zu starten.

br3nt
quelle
1
Dies ist die richtige Antwort für mich `Ver 14.14 Distrib 5.7.10, für osx10.11 (x86_64)`
Sinux
Dies sollte die richtige Antwort sein. Die anderen Antworten bieten keine dauerhafte Lösung.
Sijpkes
@ br3nt Wie erkenne ich die aktuell verwendeten Modi, damit ich die unerwünschten Modi einfach entfernen kann, falls ich nicht alle Modi deaktivieren möchte?
Simgineer
1
VersuchenSELECT @@GLOBAL.sql_mode;
br3nt
19

Wenn Sie WAMP verwenden. Klicken Sie mit der linken Maustaste auf das WAMP-Symbol, gehen Sie zu MySQL -> MySQL-Einstellungen -> SQL-Modus und wählen Sie dann SQL-Modus-> Benutzermodus

Kasse dieses Bild

Shiran Gabriel
quelle
Gibt es einen Grund, warum ich in meiner WAMP-Installation keine MySQL-Einstellungen habe? Es gibt Service Administration und MySQL-Konsole, aber keine Einstellungen?
Craig
Genau das habe ich gesucht! Vielen Dank für die Bereitstellung einer einfachen WAMP Server-Lösung! Ich brauchte dies, als ich versuchte, #aggregation in diesem Tutorial durchzuführen
Eric Hepperle - CodeSlayer2010
12

Auf meinem SQL (Version 5.7.11 unter Mac OS X) funktioniert dies für mich auf dem MySQL-Shell-Client:

SET
@@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Laut MySQL 5.6-Dokumentation ist sql_mode standardmäßig

leere Zeichenfolge in MySQL 5.6.5 und zurück NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES in 5.6.6 +

MySQL 5.6 Referenz

Salvatore Napoli
quelle
Andere Antworten behaupten sql_mode := ''möglich zu sein. Warum bist du anderer Meinung?
Hermann Döppes
Woher kommen all diese Optionen in Ihrer Zeichenfolge? Was ist der Grund dafür?
Hermann Döppes
Gemäß der MySQL 5.6-Dokumentation ist sql_mode standardmäßig eine leere Zeichenfolge in MySQL 5.6.5 und zurück. NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES in 5.6.6 dev.mysql.com/doc/refman/5.6/en/…
Salvatore Napoli
Vielen Dank für mich unter Ubuntu 16.04 - MySQL Ver 14.14 Distrib 5.7.18, für Linux (x86_64) mit EditLine Wrapper
Paul Preibisch
12

Bearbeiten Sie unter MySQL 5.7 und Ubuntu 16.04 die Datei mysql.cnf.

$ sudo nano /etc/mysql/conf.d/mysql.cnf

Fügen Sie den sql_mode wie folgt ein und speichern Sie die Datei.

[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Beachten Sie, dass ich in meinem Fall den Modus STRICT_TRANS_TABLES und ONLY_FULL_GROUP_BY entfernt habe.

Auf diese Weise wird die Moduskonfiguration dauerhaft gespeichert. Anders, wenn Sie nur den @@ sql_mode über MySQL aktualisieren, da er beim Neustart des Computers / Dienstes zurückgesetzt wird.

Starten Sie anschließend den MySQL-Dienst neu, um die geänderte Konfiguration auszuführen:

$ sudo service mysql restart

Versuchen Sie, auf die MySQL zuzugreifen:

$ mysql -u user_name -p

Wenn Sie sich anmelden und auf die MySQL-Konsole zugreifen können, ist dies in Ordnung. Großartig!

ABER , wenn du wie ich den Fehler Gesicht „unbekannte Variable sql_mode“ , die die angibt , sql_mode ist eine Option für mysqld , werden Sie zurück gehen müssen, bearbeiten Sie die Datei mysql.cnf erneut und ändern Sie das [mysql]zu [mysqld]. Starten Sie den MySQL-Dienst neu und führen Sie einen letzten Test durch, um sich an der MySQL-Konsole anzumelden. Hier ist es!

Alexandre Ribeiro
quelle
1
Ich würde den oben genannten Ansatz dringend empfehlen, als ihn dank @ alexandre-ribeiro in der Sitzung festzulegen. Für diejenigen, die Ubuntu 16.04 und mysql 5.7.x haben, bearbeiten Sie die Datei besser und geben Sie die ini- Direktive sql_mode = <modus> unter der Gruppe [mysqld] ein, da das Deklarieren gegen [mysql] meiner Erfahrung nach nicht funktioniert.
Codarrior
Ich habe MySQL 5.7.22. Es ist seltsam, aber ich musste sowohl STRICT_TRANS_TABLES als auch ONLY_FULL_GROUP_BY aus der sql_mode-Deklaration in my.cnf entfernen, wie oben gezeigt, damit dies funktioniert. In Wirklichkeit möchte ich nur den ONLY_FULL_GROUP_BY-Modus entfernen. Wenn ich "set global / session sql_mode = ..." mache, kann ich nur ONLY_FULL_GROUP_BY entfernen, ohne STRICT_TRANS_TABLES entfernen zu müssen, damit es funktioniert. Aber da dies Neustarts nicht überlebt, nützt es mir nicht viel.
RayCh
12

Folgendes habe ich durchgeführt, um das Problem auf der MySQL-Workbench zu beheben:

Bevor ich den aktuellen Wert mit dem folgenden Befehl bekam

SELECT @@sql_mode 

Später entfernte ich den Schlüssel ONLY_FULL_GROUP_BY aus der Liste und fügte den folgenden Befehl ein

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
Matt Vegas
quelle
10

Für Mac OS Mojave (10.14) Öffnen Sie das Terminal

$ sudo mkdir /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ cd /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ sudo nano my.cnf

Fügen Sie Folgendes ein:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Tastenkombinationen zum Speichern und Beenden von Nano: Ctrl+xund yundEnter

Hinweis: Möglicherweise müssen Siemysql-5.7.24-macos10.14-x86_64diese Befehleaktualisieren.Überprüfen Sie einfach den richtigen Ordnernamen, den Sie erhalten haben/usr/local/

Hoffe es wird jemandem helfen!

AamirR
quelle
10

Modi hinzufügen oder entfernen zu sql_mode

MySQL 5.7.9 oder höher

Zum Hinzufügen oder Entfernen eines Modus sql_modekönnen Sie list_addund list_dropFunktionen verwenden.

Um einen Modus aus dem aktuellen zu entfernen SESSION.sql_mode, können Sie einen der folgenden Schritte ausführen:

SET SESSION sql_mode = sys.list_drop(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY');
SET sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');

So entfernen Sie einen Modus aus dem Modus, der GLOBAL.sql_modefür den aktuellen Laufzeitvorgang bestehen bleibt , bis der Dienst neu gestartet wird .

SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');

MySQL 5.7.8 oder früher

Da es sich bei dem sql_modeWert um eine CSV-Zeichenfolge von Modi handelt, müssen Sie sicherstellen, dass die Zeichenfolge keine Restkommas enthält. Dies kann mithilfe von erreicht werden TRIM(BOTH ',' FROM ...).

Um einen Modus aus der sql_modeVariablen zu entfernen , sollten Sie REPLACE()zusammen mit verwenden, TRIM()um sicherzustellen, dass alle verbleibenden Kommas entfernt werden.

SET SESSION sql_mode = TRIM(BOTH ',' FROM REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', ''));

Um der sql_modeVariablen einen Modus hinzuzufügen , möchten Sie verwenden CONCAT_WS(',', ...), um sicherzustellen, dass ein Komma an die aktuellen Modi angehängt wird und TRIM()um sicherzustellen, dass alle verbleibenden Kommas entfernt werden.

SET SESSION sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@SESSION.sql_mode));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@GLOBAL.sql_mode));

HINWEIS: Das Ändern der GLOBALVariablen wird erst dann auf die SESSIONVariable übertragen, wenn eine neue Verbindung hergestellt wurde.

Die GLOBALVariable bleibt bestehen, bis der laufende Dienst neu gestartet wird.

Die SESSIONVariable bleibt für die aktuelle Verbindung bestehen, bis die Verbindung geschlossen und eine neue Verbindung hergestellt wird.


Zurück zu GLOBAL.sql_mode

Da die Änderung SET sql_mode = 'ONLY_FULL_GROUP_BY';ohne den GLOBALModifikator ausgeführt wurde, wirkte sich die Änderung nur auf den aktuellen SESSIONStatuswert aus, der sich auch auf bezieht @@sql_mode. Um es zu entfernen und beim Neustart des Servers auf den globalen Standardwert zurückzusetzen , möchten Sie den Wert von verwenden @@GLOBAL.sql_mode. [sic]

Der aktuelle SESSIONWert gilt nur für die aktuelle Verbindung. Durch erneutes Herstellen einer Verbindung zum Server wird der Wert auf den Wert zurückgesetztGLOBAL Wert zurückgesetzt.

Um den aktuellen Sitzungsstatuswert auf den aktuellen globalen Wert zurückzusetzen, können Sie eine der folgenden Methoden verwenden:

SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;

Ändern Sie den SESSION.sql_modeWert inONLY_FULL_GROUP_BY

SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+--------------------+----------------------------------------------+
| @@sql_mode         | @@GLOBAL.sql_mode                            |
+--------------------+----------------------------------------------+
| ONLY_FULL_GROUP_BY | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+--------------------+----------------------------------------------+

Setzen Sie den SESSION.sql_modeWert auf den GLOBAL.sql_modeWert zurück

SET sql_mode = @@GLOBAL.sql_mode;
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+----------------------------------------------+----------------------------------------------+
| @@sql_mode                                   | @@GLOBAL.sql_mode                            |
+----------------------------------------------+----------------------------------------------+
| NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------+----------------------------------------------+

Server Restart Persistent sql_mode

Verwenden Sie die Option in der Befehlszeile oder in einer Optionsdatei wie my.cnf (Unix-Betriebssysteme) oder my.ini (Windows), um den SQL-Modus beim Serverstart festzulegen. [sic]--sql-mode="modes"sql-mode="modes"

Bitte sehen Sie Ihre Version von MySQL die unterstützten und Standard bestimmen Modi .

[mysqld]

sql-mode="NO_ENGINE_SUBSTITUTION" #default <= 5.7.4

sql_modeStandardwerte

Da die Werte für die MySQL-Dokumentation pro Version entfernt wurden, habe ich sie hier als Referenz hinzugefügt.

MySQL> = 8.0.11 8.0.5 - 8.0.10 Übersprungen

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.8, <= 8.0.4

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL 5.7.7

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.5, <= 5.7.6

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION

MySQL> = 5.6.6, <= 5.7.4

NO_ENGINE_SUBSTITUTION

MySQL <= 5.6.5

''
fyrye
quelle
8

Wenn Sie MySQL 8.0.11 verwenden, müssen Sie 'NO_AUTO_CREATE_USER' aus dem SQL-Modus entfernen.

Fügen Sie die folgende Zeile in die Datei /etc/mysql/my.cnfund den [mysqld] -Header ein

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Hiren Bhut
quelle
Bisher funktioniert diese Antwort für 8.0.13
Tomésans
7

Ich verwende Doctrine und habe die driverOptions in meiner doctrine.local.php hinzugefügt:

return array(
'doctrine' => array(
    'connection' => array(
        'orm_default' => array(
            'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
            'params' => array(
                'host' => 'localhost',
                'port' => '3306',
                'user' => 'myusr',
                'password' => 'mypwd',
                'dbname' => 'mydb',
                'driverOptions' => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
                ),
            ),
        ),
    ),
));

In phpmyadmin muss der Benutzer SUPER in den Berechtigungen aktiviert haben.

Whisperer
quelle
3
Wenn Sie die yaml-Notation zum Konfigurieren von Doctrine verwenden (wie in Symfony ausgeführt), müssen Sie "1002" anstelle der Konstanten "PDO :: MYSQL_ATTR_INIT_COMMAND" verwenden. Dies ist jedoch das, wonach ich vor einigen Wochen gesucht habe und es nicht finden konnte aus. Vielen Dank für Ihre Lösung! Hat für mich gearbeitet.
Arvid
5

Für wen ein VPS / Server mit cPanel / WHM ausgeführt wird , können Sie Folgendes tun, um ONLY_FULL_GROUP_BY dauerhaft zu deaktivieren

Sie benötigen Root-Zugriff (entweder auf einem VPS oder einem dedizierten Server).

  1. Geben Sie WHM als root ein und führen Sie phpMyAdmin aus

  2. Klicken Sie auf Variablen, suchen Sie nach sql_mode, klicken Sie auf "Bearbeiten" und kopieren Sie die gesamte Zeile in dieses Textfeld

zB kopiere dies:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  1. Stellen Sie über SFTP - SSH (root) eine Verbindung zu Ihrem Server her und laden Sie die Datei herunter /etc/my.cnf

  2. Öffnen Sie mit einer Texteditordatei my.cnfauf Ihrem lokalen PC und fügen Sie (unter [mysqld]Abschnitt) die gesamte Zeile ein, die Sie in Schritt (2) kopiert haben, aber entfernen Sie sieONLY_FULL_GROUP_BY,

zB einfügen:

# disabling ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  1. Speichern Sie die my.cnfDatei und laden Sie sie wieder hoch/etc/

  2. Geben Sie WHM ein und gehen Sie zu "WHM> Dienste neu starten> SQL Server (MySQL)" und starten Sie den Dienst neu

Marco Demaio
quelle
4

Ich arbeite mit MySQL und bin beim Root-Benutzer registriert. Die Lösung, die für mich funktioniert, ist die folgende:

mysql> SET SESSION sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));

Jorge Santos Neill
quelle
3

Dies ist eine dauerhafte Lösung für MySql 5.7+ unter Ubuntu 14+:

$ sudo bash -c "echo -e \"\nsql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"  >> /etc/mysql/mysql.conf.d/mysqld.cnf"
$ sudo service mysql restart
# Check if login attempt throws any errors
$ mysql -u[user] -p # replace [user] with your own user name

Wenn Sie sich fehlerfrei anmelden können, sollten Sie jetzt fertig sein.

demisx
quelle
1

Sie können es mithilfe der Konfigurationsdatei deaktivieren my.cnf:

$ mysql --verbose --help | grep my.cnf

In macOS 10.12 ist es also bei usr/local/etc/my.cnf. Sie können sql_modehier bearbeiten :

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Dio Phung
quelle
1

Hier ist meine Lösung zum Ändern der MySQL-Konfiguration über das phpmyadmin-Dashboard:

Um zu beheben, dass "dies nicht mit sql_mode = only_full_group_by kompatibel ist": Öffnen Sie phpmyadmin und gehen Sie zur Startseite und wählen Sie das Untermenü "Variablen". Scrollen Sie nach unten, um den SQL-Modus zu finden. Bearbeiten Sie den SQL-Modus und entfernen Sie 'ONLY_FULL_GROUP_BY'. Speichern Sie ihn.

Marcello Perri
quelle
0

mit MySQL Version 5.7.28 überprüfen mit
SELECT @@sql_mode; und aktualisieren mit

SET @@sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
Karthik
quelle