Wyłącz ONLY_FULL_GROUP_BY

614

Przypadkowo włączyłem tryb ONLY_FULL_GROUP_BY w następujący sposób:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Jak mogę to wyłączyć?

ZviBar
źródło
38
Próbowałeś SET sql_mode = ''?
Tripp Kinetics
4
Dlaczego miałbyś chcieć wyłączyć tryb, który sprawia, że ​​MySQL jest lepiej zgodny ze standardami SQL, a także jeden, który uczy, jak być bardziej ostrożnym w pisaniu zapytań?
Andriy M
34
Od wersji Mysql 5.7 możesz alternatywnie użyć funkcji ANY_VALUE ( column), aby ponownie dopasować zapytanie. Zobacz dokument tutaj
Qoheleth-Tech
3
@AndriyM Będę musiał wkrótce tego użyć, ponieważ przenoszę całą masę starych aplikacji na nowy serwer i muszą one działać bez względu na to, czy mam źródło, czy nie.
Jaydee
8
@AndriyM Ponieważ jeśli grupuję według unikalnej kolumny indeksu, JUŻ WIEM, że każdy wiersz będzie unikalny - dodając osobną grupę dla każdego polecenia. pojedynczy. kolumna. w stole jest królewski ból.
Benubird

Odpowiedzi:

1163

Rozwiązanie 1: Usuń ONLY_FULL_GROUP_BY z konsoli mysql

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

możesz przeczytać więcej tutaj

Rozwiązanie 2: Usuń ONLY_FULL_GROUP_BY z phpmyadmin

  • Otwórz phpmyadmin i wybierz localhost
  • Kliknij menu Zmienne i przewiń w dół do trybu sql
  • Kliknij przycisk edycji, aby zmienić wartości i usunąć ONLY_FULL_GROUP_BY, a następnie kliknij przycisk Zapisz. wprowadź opis zdjęcia tutaj
Eyo Okon Eyo
źródło
12
To rozwiązanie działa dobrze na mySQL 5.7.11 i powinno być zaakceptowane. Akceptowana odpowiedź nie działa w nowej wersji mySQL
Anyone_ph 14.04.16
4
Właśnie zapewnione. To nie ma znaczenia REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), MySQL i tak usuwa niechciane przecinki z rekordu. Odpowiedź OP jest poprawna.
nawfal
40
Działa to, ale po ponownym uruchomieniu serwera mysql przywracane są ustawienia domyślne ... dlaczego? czy istnieje trwałe rozwiązanie? Dzięki!
Vincent Pazeller
52
Aby odpowiedzieć na moje pytanie (trwałe rozwiązanie): musisz umieścić opis trybu sql_mode w pliku my.cnf (na przykład /etc/my.cnf) i zrestartować serwer. Na przykład, wkładka (poniżej [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
GLOBALnie działało dla mnie, ale działało SESSION. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre
371

Aktualizacja:

wprowadź opis zdjęcia tutaj

Aby zachować bieżące ustawienia MySQL i wyłączyć ONLY_FULL_GROUP_BY, sugeruję odwiedzić phpmyadmin lub innego klienta, którego używasz i wpisać:

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

następna kopia wyniku do my.inipliku.

mięta :sudo nano /etc/mysql/my.cnf

Ubuntu 16 i nowsze :sudo nano /etc/mysql/my.cnf

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

Uwaga! copy_mewynik może zawierać długi tekst, który może być domyślnie przycięty. Upewnij się, że skopiowałeś cały tekst!


stara odpowiedź:

Jeśli chcesz trwale wyłączyć błąd, „ Wyrażenie nr N listy SELECT nie znajduje się w klauzuli GROUP BY i zawiera niezagregowaną kolumnę„ db.table.COL ”, która nie jest funkcjonalnie zależna od kolumn w klauzuli GROUP BY; jest to niezgodne z trybem sql_mode = only_full_group_by „wykonaj następujące czynności:

  1. sudo nano /etc/mysql/my.cnf
  2. Dodaj to na końcu pliku

    [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 zrestartować MySQL

Spowoduje to wyłączenie ONLY_FULL_GROUP_BYdla WSZYSTKICH użytkowników

breq
źródło
2
dla mnie ustawienie tagu mysqld na tej samej linii nie działało, ale działało z
podziałem
23
W przypadku Ubuntu plik, do którego trafiają niestandardowe wartości konfiguracji, to/etc/mysql/mysql.conf.d/mysqld.cnf
knb
5
Działa to dla Ubuntu 16.04 (14 do 16 nieszczęść aktualizacji ..). /Etc/mysql/my.cnf jest poprawnym plikiem. Plik wymieniony przez knb jest zawarty w tym pliku my.cnf, przynajmniej w 16.04 (konfiguracja jest teraz podzielona na wiele plików).
jwinn
2
Użyj „SELECT @@ sql_mode;” aby sprawdzić, jakie tryby są aktualnie włączone przed wprowadzeniem zmian.
Zbigniew Ledwoń
1
rzeczywiste miejsce, w którym zobaczysz, [mysqld]może nie znajdować się w tym pliku, może znajdować się w katalogu dołączania. Najpierw użyj tego polecenia: grep -R "\[mysqld\]" *aby zobaczyć, co tam jest - i spróbujgrep -R "\bsql_mode\b" *
Oliver Williams
203

Uważaj przy użyciu

SET sql_mode = '' 

To faktycznie usuwa wszystkie aktualnie włączone tryby. Jeśli nie chcesz zadzierać z innymi ustawieniami, zrób to

SELECT @@sql_mode 

najpierw, aby uzyskać listę trybów oddzielonych przecinkami, a następnie ustaw ją na tej liście bez ONLY_FULL_GROUP_BYopcji.

Taran
źródło
Jak najlepiej to zrobić then SET it to this list without the ONLY_FULL_GROUP_BY option.:?
Kevin Meredith,
4
@KevinMeredith czytając dokumenty, nie ma sposobu, aby włączać / wyłączać jeden tryb na raz - wszystkie przykłady wymagają podania oddzielonej przecinkami listy tych, które chcesz - np.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';
William Turrell
1
Jeśli jest to trwała zmiana, edytuj plik my.cnf za pomocą następującego wiersza:, a sql_mode=<comma-separated-list>następnie zatrzymaj się i uruchom serwer. Postępuj zgodnie z dokumentacją systemu operacyjnego, aby znaleźć i najlepszy sposób edycji pliku my.cnf.
blackwood
107

Wypróbuj to:

SET sql_mode = ''

Uwaga społeczności: jak wskazano w odpowiedziach poniżej, powoduje to usunięcie wszystkich aktualnie włączonych trybów SQL. To niekoniecznie musi być to, czego chcesz.

Tripp Kinetics
źródło
11
Wow, ''= 'full group by is disabled'? MySQL robi pewne głupie rzeczy, ale ten jest na górze.
Aaron Bertrand
38
Myślę, że to w zasadzie wyłącza dowolny tryb sql;
ZviBar
To nie działało dla mnie. Widzę, 0 rows affecteda moje zapytanie nadal nie działa:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber
10
Przed wypróbowaniem tej odpowiedzi zdecydowanie spójrz na ostrzeżenie Machavity i jeśli chcesz, aby zmiany się utrzymywały, użyj globalpolecenia .
thomas88wp
6
Za każdym razem, gdy wracam do MySql po jakimś czasie, zawsze napotykam ten problem, który mnie denerwuje, ponieważ zawsze zapominam o problemie :) To uczucie jest rozczarowujące, kiedy myślisz, że to działało, a teraz nie działa z powodu zmiany wersji.
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
źródło
@ RémiBreton: jaka jest twoja wersja MySQL?
WeiYuan
6
To rzeczywiście działa. Ale po ponownym uruchomieniu systemu (ubuntu 16.04), sql_modeprzywracam poprzednią wartość. Co mogę teraz zrobić?
pktangyue
niesamowite, działało dla mnie, po prostu muszę to na stałe przekonwertować
Fernando Torres
74

Dodanie tylko jednego trybu do trybu sql_mode bez usuwania istniejących:

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

Usuwanie tylko określonego trybu z trybu sql_mode bez usuwania innych:

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

W twoim przypadku, jeśli chcesz usunąć tylko ONLY_FULL_GROUP_BYtryb, użyj poniższego polecenia:

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

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

Janaka R Rajapaksha
źródło
To świetna odpowiedź! Dzięki.
śr.
Czy to jest globalne czy na bieżącym połączeniu? Świetna odpowiedź!
Oliver M. Grech,
48

Dzięki @cwhisperer. Miałem ten sam problem z Doctrine w aplikacji Symfony. Właśnie dodałem opcję do mojego config.yml:

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

To działało dobrze dla mnie.

Arvid
źródło
1
A jeśli trzeba połączyć z SET NAZWAMI „utf8”, użyj następującego „SET NAMES” utf8 ”, tryb_sql = (WYBIERZ WYMIENĘ (@@ tryb_sql,„ TYLKO PEŁNY_GROUP_BY ”,„ ”));”. Jeśli zamiast tego zostaną użyte dwa zapytania, np. „SET NAMES 'utf8”; SET sql_mod ... ”, wygeneruje„ Ogólny błąd: 2014 Nie można wykonać zapytania, gdy aktywne są inne niebuforowane zapytania ”.
Ventzy Kunev,
@VentzyKunev proszę nie postępuj zgodnie z tą radą i nie ustawiaj SET NAMESza pomocą tej metody, w większości przypadków nie jest to konieczne symfony już to ustawia za pośrednictwem doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html , i robi to poprawnie za pomocą PDO dns, SET NAMES to przestarzały sposób, który nie powinien być używany w wersji PHP wyższej niż 5.3
LPodolski
39

Na:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16, dla Linux (x86_64) przy użyciu opakowania EditLine

Zrobić:

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

Kopiuj i wklej:

[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

Na dole pliku

$ sudo service mysql restart
Jadeye
źródło
Czy plik mysql.cnf nigdy nie zostanie nadpisany przez aktualizację mysql?
whisperer
1
@cwhisperer /etc/mysql/mysql.cnfwskazuje na 2 foldery konfiguracji !includedir /etc/mysql/conf.d/+ !includedir /etc/mysql/mysql.conf.d/. To samo dotyczy /etc/mysql/my.cnf. Dlatego zakładam, że pliki konfiguracji nie są zastępowane podczas aktualizacji. Możesz przeczytać więcej tutajhttp://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye
Próbowałem tego i nie działało na bionic Ubuntu 18.04.2. Postępowałem zgodnie z tym i zadziałało: sitepoint.com/… - może ważne jest, aby używać tego formatu ze spacjami i cytatami: sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"może ważne jest, aby /etc/mysql/mysql.conf.d/mysqld_mode.cnfzamiast tego utworzyć nowy plik
rubo77
Działa to nawet po ponownym uruchomieniu serwera mysql
Akshay Khale
36

Zauważyłem, że @Eyo Okon Eyo działa tak długo, jak długo serwer MySQL nie zostanie zrestartowany, a następnie przywrócone zostaną ustawienia domyślne. Oto trwałe rozwiązanie, które działało dla mnie:

Aby usunąć konkretny tryb SQL (w tym przypadku ONLY_FULL_GROUP_BY ), znajdź bieżący tryb SQL:

SELECT @@GLOBAL.sql_mode;

skopiuj wynik i usuń z niego to, czego nie potrzebujesz ( ONLY_FULL_GROUP_BY )

na przykład:

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

do

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

utwórz i otwórz ten plik:

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

i napisz i wklej do niego swój nowy tryb SQL:

[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

zrestartuj MySQL:

sudo service mysql restart

Lub możesz użyć, ANY_VALUE()aby stłumić odrzucenie wartości ONLY_FULL_GROUP_BY, możesz przeczytać więcej na ten temat tutaj

Waqleh
źródło
3
DoANY_VALUE()
Sithu,
25

Dokumentacja MySQL określa również następujące metody:

  • Zestaw sql-mode="<modes>" w pliku opcji, takim jak my.cnf (systemy operacyjne Unix) lub my.ini (Windows).
  • Aby ustawić tryb SQL podczas uruchamiania serwera za pomocą wiersza polecenia, użyj --sql-mode="<modes>"opcji.

*Gdzie <modes> jest lista różnych trybów oddzielonych przecinkami.

Aby jawnie wyczyścić tryb SQL, ustaw go na pusty ciąg znaków, używając --sql-mode=""w wierszu polecenia lubsql-mode="" w pliku opcji.

Dodałem sql-mode=""opcję /etc/my.cnfi zadziałało.

To rozwiązanie SO omawia sposoby sprawdzenia, który plik my.cnf jest używany przez MySQL.

Nie zapomnij zrestartować MySQL po dokonaniu zmian.

br3nt
źródło
1
to jest poprawna odpowiedź dla mnie `Ver 14.14 Distrib 5.7.10, dla osx10.11 (x86_64)`
Sinux
należy zaznaczyć prawidłową odpowiedź. Pozostałe odpowiedzi nie zapewniają stałego rozwiązania.
sijpkes
@ br3nt Jak mogę wykryć, jakie są obecnie używane tryby, aby po prostu usunąć niepożądane tryby, na wypadek, gdyby nie chciałem wyłączać wszystkich trybów?
simgineer
1
SpróbujSELECT @@GLOBAL.sql_mode;
br3nt
19

Jeśli używasz WAMP. Kliknij lewym przyciskiem myszy ikonę WAMP, a następnie przejdź do MySQL -> Ustawienia MySQL -> tryb sql, a następnie wybierz tryb sql-> tryb użytkownika

Kasy tego obrazu

Shiran Gabriel
źródło
Czy istnieje powód, dla którego nie mam ustawień MySQL w instalacji WAMP? Istnieje administracja usług i konsola MySQL, ale nie ma ustawień?
Craig,
Właśnie tego szukałem! Dziękujemy za zapewnienie prostego rozwiązania WAMP Server! Potrzebowałem tego podczas próby #agregacji w tym samouczku: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010
12

Na moim sql (wersja 5.7.11 działająca na Mac OS X) działa to dla mnie na kliencie powłoki 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"

Zgodnie z dokumentacją MySQL 5.6 tryb_sql jest domyślnie ustawiony na

pusty ciąg w MySQL 5.6.5 i wstecz NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES w 5.6.6 +

Odniesienie do mysql 5.6

Salvatore Napoli
źródło
Inne odpowiedzi twierdzą, sql_mode := ''że są możliwe. Dlaczego się nie zgadzasz?
Hermann Döppes
Skąd się biorą te wszystkie opcje w twoim ciągu? Jakie jest tego uzasadnienie?
Hermann Döppes
Zgodnie z dokumentacją MySQL 5.6 domyślnym trybem sql_m jest pusty ciąg w MySQL 5.6.5 i odwrotnie NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES w 5.6.6 dev.mysql.com/doc/refman/5.6/en/...
Salvatore Napoli
Dzięki działało dla mnie na Ubuntu 16.04 - mysql Ver 14.14 Distrib 5.7.18, dla Linuxa (x86_64) przy użyciu opakowania EditLine
Paul Preibisch
12

Na MySQL 5.7 i Ubuntu 16.04 edytuj plik mysql.cnf.

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

Dodaj tryb sql jak poniżej i zapisz plik.

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

Zauważ, że w moim przypadku usunąłem tryb STRICT_TRANS_TABLES i ONLY_FULL_GROUP_BY.

W ten sposób na stałe zapisze konfigurację trybu. Inaczej, jeśli zaktualizujesz tryb @@ sql_mode za pomocą MySQL, ponieważ zresetuje się po ponownym uruchomieniu komputera / usługi.

Następnie, aby zmodyfikowana konfiguracja podjęła działanie, uruchom ponownie usługę mysql:

$ sudo service mysql restart

Spróbuj uzyskać dostęp do mysql:

$ mysql -u user_name -p

Jeśli możesz się zalogować i uzyskać dostęp do konsoli MySQL, jest w porządku. Świetny!

ALE , jeśli tak jak ja, napotykasz błąd „nieznana zmienna tryb_sql” , co oznacza, że tryb_sql jest opcją dla mysqld , musisz wrócić, ponownie edytować plik mysql.cnf i zmienić [mysql]na[mysqld] . Uruchom ponownie usługę MySQL i wykonaj ostatni test, próbując zalogować się na konsoli MySQL. Oto jest!

Alexandre Ribeiro
źródło
1
Zdecydowanie poleciłbym wyżej wymienione podejście niż ustawienie go na sesji, dzięki @ alexandre-ribeiro. Dla tych, którzy mają Ubuntu 16.04 i mysql 5.7.x, lepiej edytuj plik i wprowadź dyrektywę ini sql_mode = <the tryby> w grupie [mysqld] , ponieważ deklarowanie przeciwko [mysql] nie działa, zgodnie z moim doświadczeniem.
codarrior
Mam MySQL 5.7.22. To dziwne, ale musiałem usunąć zarówno STRICT_TRANS_TABLES, jak i ONLY_FULL_GROUP_BY z deklaracji trybu sql_mode w pliku my.cnf, jak pokazano powyżej, aby to zadziałało. W rzeczywistości chcę tylko usunąć tryb ONLY_FULL_GROUP_BY. Jeśli zrobię „ustaw tryb globalny / sesyjny tryb_sql = ...”, mogę usunąć tylko TYLKO_FULL_GROUP_BY bez konieczności usuwania STRICT_TRANS_TABLES, aby działał. Ale ponieważ to nie przetrwa, uruchomi się ponownie, więc nie przydaje mi się to zbytnio.
RayCh,
12

Oto, co zrobiłem, aby naprawić na Mysql workbench:

Zanim uzyskałem bieżącą wartość za pomocą poniższego polecenia

SELECT @@sql_mode 

później usunąłem klucz ONLY_FULL_GROUP_BY z listy i wkleiłem poniższe polecenie

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
źródło
10

W systemie Mac OS Mojave (10.14) Otwórz 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

Wklej następujące:

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

ShortKeys do Save & Exit nano: Ctrl+xi yiEnter

Uwaga: Może być konieczne zaktualizowaniemysql-5.7.24-macos10.14-x86_64tych poleceń, po prostu sprawdź poprawną nazwę folderu, który masz/usr/local/

Mam nadzieję, że to komuś pomoże!

AamirR
źródło
10

Dodaj lub usuń tryby do sql_mode

MySQL 5.7.9 lub nowszy

Aby dodać lub usunąć tryb sql_mode, możesz użyć list_addilist_drop funkcji.

Aby usunąć tryb z bieżącego SESSION.sql_mode, możesz użyć jednej z następujących czynności:

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');

Aby usunąć tryb z tego, GLOBAL.sql_modektóry utrzymuje się dla bieżącej operacji środowiska wykonawczego , do momentu ponownego uruchomienia usługi .

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

MySQL 5.7.8 lub wcześniejszy

Ponieważ sql_modewartością jest ciąg trybów CSV, należy upewnić się, że ciąg nie zawiera pozostałych przecinków, co można osiągnąć za pomocą TRIM(BOTH ',' FROM ...).

Aby usunąć tryb ze sql_modezmiennej, należy użyć REPLACE()wraz z, TRIM()aby upewnić się, że wszystkie pozostałe przecinki zostały usunięte.

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', ''));

Aby dodać tryb do sql_modezmiennej, powinieneś użyć CONCAT_WS(',', ...), aby dopilnować, aby do bieżących trybów dodano przecinek, i TRIM()aby usunąć wszelkie pozostałe przecinki.

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));

UWAGA: Zmiana GLOBALzmiennej nie jest propagowana do plikuSESSION zmiennej, dopóki nie zostanie ustanowione nowe połączenie.

GLOBALZmienna będzie trwać aż usługa uruchomiona zostaje wznowiona.

SESSIONZmienna będzie się utrzymywać na obecnym związku, aż połączenie zostanie zamknięte, a nowe połączenie zostanie nawiązane.


Przywrócić GLOBAL.sql_mode

Ponieważ SET sql_mode = 'ONLY_FULL_GROUP_BY';zostało wykonane bez GLOBALmodyfikatora, zmiana wpłynęła tylko na bieżącą SESSIONwartość stanu, która również dotyczy @@sql_mode. Aby go usunąć i przywrócić globalną wartość domyślną przy ponownym uruchomieniu serwera , należy użyć wartości z @@GLOBAL.sql_mode. [sic]

Aktualna SESSIONwartość jest ważna tylko dla bieżącego połączenia. Ponowne połączenie z serwerem przywróci wartość z powrotem do GLOBAL wartości.

Aby przywrócić bieżącą wartość stanu sesji do bieżącej wartości globalnej, możesz użyć jednej z następujących czynności:

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

Zmień SESSION.sql_modewartość naONLY_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 |
+--------------------+----------------------------------------------+

Przywróć SESSION.sql_modewartość do GLOBAL.sql_modewartości

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 |
+----------------------------------------------+----------------------------------------------+

Trwa restart serwera sql_mode

Aby ustawić tryb SQL podczas uruchamiania serwera, użyj --sql-mode="modes"opcji w wierszu polecenia lubsql-mode="modes" w pliku opcji, takim jak my.cnf (systemy operacyjne Unix) lub my.ini (Windows). [sic]

Sprawdź swoją wersję MySQL, aby określić obsługiwaną i domyślną tryby .

[mysqld]

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

sql_modeWartości domyślne

Ponieważ wartości dokumentacji dla MySQL dla poszczególnych wersji zostały usunięte, dodałem je tutaj w celach informacyjnych.

MySQL> = 8.0.11 8.0.5 - 8.0.10 Pominięto

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
źródło
8

Jeśli używasz MySQL 8.0.11, musisz usunąć „NO_AUTO_CREATE_USER” z trybu sql.

Dodaj następujący wiersz w pliku /etc/mysql/my.cnfi nagłówek [mysqld]

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Hiren Bhut
źródło
jak dotąd ta odpowiedź działa w wersji 8.0.13
tomexsans
7

Używam doktryny i dodałem driverOptions w moim doctrine.local.php:

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',''))"
                ),
            ),
        ),
    ),
));

W phpmyadmin użytkownik potrzebuje SUPER aktywowanego w uprawnieniach.

cwhisperer
źródło
3
Używając notacji yaml do konfigurowania Doctrine (jak to zrobiono w Symfony), musisz użyć „1002” zamiast stałej „PDO :: MYSQL_ATTR_INIT_COMMAND”, ale mimo to tego szukałem kilka tygodni temu i nie mogłem znaleźć na zewnątrz. Dzięki za twoje rozwiązanie! Pracował dla mnie.
Arvid,
5

Dla kogo działa VPS / Server z cPanel / WHM , możesz wykonać następujące czynności, aby trwale wyłączyć ONLY_FULL_GROUP_BY

Potrzebujesz dostępu do roota (na VPS lub na dedykowanym serwerze)

  1. Wpisz WHM jako root i uruchom phpMyAdmin

  2. Kliknij Zmienne, poszukaj sql_mode, kliknij „Edytuj” i skopiuj całą linię w tym polu tekstowym

np. skopiuj to:

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. Połącz się z serwerem za pośrednictwem SFTP - SSH (root) i pobierz plik /etc/my.cnf

  2. Otwórz za pomocą my.cnfpliku edytora tekstu na komputerze lokalnym i wklej do niego (w [mysqld]sekcji) całą linię skopiowaną w kroku (2), ale usuńONLY_FULL_GROUP_BY,

np. wklej to:

# 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. Zapisz my.cnfplik i prześlij go z powrotem do/etc/

  2. Wpisz WHM i przejdź do „WHM> Uruchom ponownie usługi> SQL Server (MySQL)” i uruchom ponownie usługę

Marco Demaio
źródło
4

Pracuję z mysql i zarejestrowałem się jako użytkownik root, rozwiązanie, które działa dla mnie jest następujące:

mysql> SET SESSION tryb_sql = (WYBIERZ WYMIENĘ (@@ tryb_sql, „TYLKO PEŁNY_GROUP_BY”, „”));

Jorge Santos Neill
źródło
3

Jest to trwałe rozwiązanie dla MySql 5.7+ na 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

Jeśli jesteś w stanie zalogować się bez błędów - wszystko powinno być już ustawione.

półmisek
źródło
1

Możesz go wyłączyć za pomocą pliku konfiguracyjnego my.cnf:

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

Tak więc w systemie macOS 10.12 jest to usr/local/etc/my.cnf. Możesz edytować sql_modetutaj:

# 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
źródło
1

Oto moje rozwiązanie zmieniające konfigurację Mysql poprzez pulpit nawigacyjny phpmyadmin:

Aby naprawić błąd „jest to niezgodne z trybem sql = only_full_group_by”: Otwórz stronę główną phpmyadmin i goto i wybierz podmenu „Zmienne”. Przewiń w dół, aby znaleźć tryb sql. Edytuj tryb sql i usuń „ONLY_FULL_GROUP_BY” Zapisz.

Marcello Perri
źródło
0

z MySQL w wersji 5.7.28 sprawdź za pomocą
SELECT @@sql_mode; i zaktualizuj za pomocą

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
źródło