Disabilita ONLY_FULL_GROUP_BY


615

Ho abilitato accidentalmente la modalità ONLY_FULL_GROUP_BY in questo modo:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Come lo disabilito?


39
Ci hai provato SET sql_mode = ''?
Tripp Kinetics,

4
Perché dovresti disabilitare una modalità che consenta a MySQL di conformarsi meglio agli standard SQL e anche una che ti insegna a stare più attento nello scrivere le tue domande?
Andriy M,

34
A partire da Mysql 5.7 puoi, in alternativa, utilizzare la funzione ANY_VALUE ( column) per aggiornare la tua query. Vedi documento qui
Qoheleth-Tech,

3
@AndriyM Dovrò usarlo presto perché sto trasferendo un intero carico di vecchie applicazioni su un nuovo server e devono funzionare, che io abbia o meno il sorgente.
Jaydee,

8
@AndriyM Perché se sto raggruppando per una colonna di indice univoca, allora so GIÀ che ogni riga sarà unica - aggiungendo un gruppo separato per comando per ogni. singolo. colonna. nella tabella è un dolore reale.
Benubird,

Risposte:


1163

Soluzione 1: rimuovere ONLY_FULL_GROUP_BY dalla console mysql

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

puoi leggere di più qui

Soluzione 2: rimuovere ONLY_FULL_GROUP_BY da phpmyadmin

  • Apri phpmyadmin e seleziona localhost
  • Fai clic sul menu Variabili e scorri verso il basso per la modalità sql
  • Fai clic sul pulsante Modifica per modificare i valori e rimuovere ONLY_FULL_GROUP_BY e fai clic su Salva. inserisci qui la descrizione dell'immagine

12
Questa soluzione funziona perfettamente su mySQL 5.7.11 e dovrebbe essere accettata. La risposta accettata non funziona con la nuova versione di mySQL
Anyone_ph

4
Appena assicurato. Non importa REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), MySQL rimuove comunque le virgole indesiderate dal record. La risposta dell'OP è corretta.
nawfal,

40
Funziona, ma quando riavvio il server mysql, le impostazioni predefinite vengono ripristinate ... perché? c'è una soluzione persistente? Grazie!
Vincent Pazeller,

52
Per rispondere alla mia domanda (soluzione persistente): devi inserire la descrizione di sql_mode in un file my.cnf (/etc/my.cnf per esempio) e riavviare il server. Per esempio, inserto (sotto la sezione [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
GLOBALnon ha funzionato per me, ma SESSIONha funzionato. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre

371

Aggiornare:

inserisci qui la descrizione dell'immagine

Per mantenere le impostazioni correnti di mysql e disabilitarle, ONLY_FULL_GROUP_BYsuggerisco di visitare phpmyadmin o qualunque client si stia utilizzando e digitare:

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

risultato della copia successiva nel tuo my.inifile.

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

Ubuntu 16 e versioni successive :sudo nano /etc/mysql/my.cnf

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

Attenzione! copy_meIl risultato può contenere un testo lungo che potrebbe essere ritagliato per impostazione predefinita. Assicurati di copiare l'intero testo!


vecchia risposta:

Se si desidera disabilitare in modo permanente l' errore "L' espressione #N dell'elenco SELECT non è nella clausola GROUP BY e contiene la colonna non aggregata 'db.table.COL' che non è funzionalmente dipendente dalle colonne nella clausola GROUP BY; ciò è incompatibile con sql_mode = only_full_group_by "fai questi passaggi:

  1. sudo nano /etc/mysql/my.cnf
  2. Aggiungi questo alla fine del file

    [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 per riavviare MySQL

Questo disabiliterà ONLY_FULL_GROUP_BYper TUTTI gli utenti


2
per me, impostare il tag mysqld sulla stessa riga non ha funzionato, ma ha funzionato con un'interruzione di riga :) grazie
bloub,

23
Per ubuntu, il file in cui vanno i valori di configurazione personalizzati è/etc/mysql/mysql.conf.d/mysqld.cnf
knb

5
Questo ha funzionato per Ubuntu 16.04 (14-16 problemi di aggiornamento ..). Il file /etc/mysql/my.cnf è il file corretto. Il file menzionato da knb è incluso in questo file my.cnf, almeno nel 16.04 (la configurazione è ora suddivisa in più file).
jwinn,

2
Utilizzare "SELECT @@ sql_mode;" per vedere quali modalità sono attualmente attive prima di apportare modifiche.
Zbigniew Ledwoń,

1
il luogo effettivo in cui vedrai [mysqld]potrebbe non essere in questo file, potrebbe trovarsi in una directory include. Usa prima questo comando: grep -R "\[mysqld\]" *per vedere cosa c'è - e per questo provagrep -R "\bsql_mode\b" *
Oliver Williams il

203

Stai attento usando

SET sql_mode = '' 

Questo in realtà cancella tutte le modalità attualmente abilitate. Se non vuoi fare confusione con altre impostazioni, ti consigliamo di fare un

SELECT @@sql_mode 

in primo luogo, per ottenere un elenco separato da virgole delle modalità abilitate, quindi SET su questo elenco senza l' ONLY_FULL_GROUP_BYopzione.


Qual è il modo migliore per farlo then SET it to this list without the ONLY_FULL_GROUP_BY option.:?
Kevin Meredith il

4
@KevinMeredith la mia lettura dei documenti è che non c'è modo di attivare / disattivare una modalità alla volta - tutti gli esempi richiedono di fornire un elenco separato da virgole di quelli che desideri - ad esempioSET 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
Se si tratta di una modifica permanente, modifica my.cnf con una riga come questa:, sql_mode=<comma-separated-list>quindi fermati e avvia il tuo server. Segui i documenti del tuo sistema operativo per l'ubicazione e il modo migliore per modificare my.cnf.
Blackwood,

107

Prova questo:

SET sql_mode = ''

Nota della comunità: come indicato nelle risposte di seguito, questo in realtà cancella tutte le modalità SQL attualmente abilitate. Potrebbe non essere necessariamente quello che vuoi.


11
Wow, ''= 'full group by is disabled'? MySQL fa alcune cose piuttosto stupide, ma quella è lassù.
Aaron Bertrand,

38
Penso che questo sostanzialmente disabiliti qualsiasi modalità sql;
ZviBar,

Questo non ha funzionato per me. Vedo 0 rows affectede la mia domanda non funziona ancora:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber

10
Prima di provare questa risposta, guarda sicuramente l'avvertimento di Machavity e se vuoi che le modifiche persistano, assicurati di usare globalnel comando .
thomas88wp,

6
Ogni volta che torno a MySql dopo qualche tempo, incontro sempre questo problema che mi dà fastidio, perché dimentico sempre qual è il problema :) La sensazione è solo deludente, quando pensi che funzionasse e ora non lo fa a causa del cambio di versione.
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;

@ RémiBreton: qual è la tua versione mysql?
WeiYuan

6
Questo funziona davvero. Ma dopo aver riavviato il mio sistema (ubuntu 16.04), il sql_moderollback al valore precedente. Cosa posso fare ora?
pktangyue,

fantastico, ha funzionato per me, ho solo bisogno di convertirlo definitivamente
Fernando Torres il

74

Aggiunta di una sola modalità a sql_mode senza rimuovere quelle esistenti:

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

Rimozione solo di una modalità specifica da sql_mode senza rimuoverne altre:

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

Nel tuo caso, se vuoi rimuovere solo la ONLY_FULL_GROUP_BYmodalità, usa il comando seguente:

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

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


Questa è un'ottima risposta! Grazie.
wedi,

1
È globale o sulla connessione corrente? Bella risposta!
Oliver M Grech,

48

Grazie a @cwhisperer. Ho avuto lo stesso problema con Doctrine in un'app di Symfony. Ho appena aggiunto l'opzione al mio 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',''))"

Questo ha funzionato bene per me.


1
E se è necessario combinare con SET NAMES 'utf8', utilizzare come segue "SET NAMES 'utf8', sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));". Se invece vengono utilizzate due query come "SET NAMES 'utf8'; SET sql_mod ..." genererà "Errore generale: 2014 Impossibile eseguire query mentre sono attive altre query senza buffer."
Ventzy Kunev,

@VentzyKunev per favore non seguire questo consiglio e non impostare SET NAMESusando questo metodo, nella maggior parte dei casi non è necessario symfony già impostato tramite doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html , e lo fa correttamente tramite PDS dns, SET NAMES è un modo obsoleto di farlo, che non dovrebbe essere usato per la versione PHP maggiore di 5.3
LPodolski,

39

Su:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distribuisci 5.7.16, per Linux (x86_64) usando il wrapper EditLine

Fare:

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

Copia e incolla:

[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

Alla fine del file

$ sudo service mysql restart

Mysql.cnf non verrà mai sovrascritto da un aggiornamento mysql?
cwhisperer,

1
@cwhisperer /etc/mysql/mysql.cnfpunta a 2 cartelle di configurazione !includedir /etc/mysql/conf.d/+ !includedir /etc/mysql/mysql.conf.d/. Lo stesso vale per /etc/mysql/my.cnf. Quindi presumo che i file di configurazione non vengano sovrascritti durante l'aggiornamento. Puoi leggere di più quihttp://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye l'

Ho provato questo e non ha funzionato su Ubuntu 18.04.2 bionic. Ho seguito questo e ha funzionato: sitepoint.com/... - forse è importante utilizzare questo formato con spazi e citazioni: sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"forse è importante creare un nuovo file /etc/mysql/mysql.conf.d/mysqld_mode.cnf, invece
rubo77

Funziona anche dopo il riavvio del server mysql
Akshay Khale

36

Ho notato che la soluzione @Eyo Okon Eyo funziona fino a quando il server MySQL non viene riavviato, quindi vengono ripristinate le impostazioni predefinite. Ecco una soluzione permanente che ha funzionato per me:

Per rimuovere una particolare modalità SQL (in questo caso ONLY_FULL_GROUP_BY ), trova la modalità SQL corrente:

SELECT @@GLOBAL.sql_mode;

copia il risultato e rimuovi da esso ciò di cui non hai bisogno ( ONLY_FULL_GROUP_BY )

per esempio:

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

per

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

crea e apri questo file:

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

e scrivi e incolla la tua nuova modalità 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

riavvia MySQL:

sudo service mysql restart

Oppure puoi utilizzare ANY_VALUE()per sopprimere il rifiuto del valore ONLY_FULL_GROUP_BY, puoi leggere di più qui


3
Up forANY_VALUE()
Sithu,

25

La documentazione di MySQL specifica inoltre i seguenti metodi:

  • Impostare sql-mode="<modes>"in un file di opzioni come my.cnf (sistemi operativi Unix) o my.ini (Windows).
  • Per impostare la modalità SQL all'avvio del server tramite la riga di comando, utilizzare l' --sql-mode="<modes>"opzione.

* Dov'è <modes>un elenco di diverse modalità separate da virgole.

Per cancellare esplicitamente la modalità SQL, impostarla su una stringa vuota utilizzando --sql-mode=""dalla riga di comando o sql-mode=""in un file di opzioni.

Ho aggiunto l' sql-mode=""opzione /etc/my.cnfe ha funzionato.

Questa soluzione SO discute i modi per scoprire quale file my.cnf è utilizzato da MySQL.

Non dimenticare di riavviare MySQL dopo aver apportato modifiche.


1
questa è la risposta corretta per me `Ver 14.14 Distrib 5.7.10, per osx10.11 (x86_64)`
Sinux

questa dovrebbe essere contrassegnata come la risposta corretta. Le altre risposte non forniscono una soluzione permanente.
sijpkes,

@ br3nt Come posso rilevare quali sono le modalità correnti utilizzate in modo da poter semplicemente rimuovere le modalità indesiderate nel caso in cui non volessi annullare tutte le modalità?
ingegnere

1
ProvaSELECT @@GLOBAL.sql_mode;
br3nt

19

Se si utilizza WAMP. Fai clic sinistro sull'icona WAMP, quindi vai su MySQL -> Impostazioni MySQL -> sql-mode e quindi seleziona sql-mode-> modalità utente

Guarda questa immagine


C'è un motivo per cui non ho le impostazioni MySQL nella mia installazione di WAMP? C'è amministrazione dei servizi e console MySQL ma nessuna impostazione?
Craig,

Questo e 'esattamente quello che stavo cercando! Grazie per aver fornito una semplice soluzione WAMP Server! Ne avevo bisogno mentre cercavo di fare #aggregazione in questo tutorial: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010

12

Sul mio sql (versione 5.7.11 in esecuzione su Mac OS X) questo funziona per me sul client shell 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"

Secondo la documentazione di MySQL 5.6, sql_mode è l'impostazione predefinita

stringa vuota in MySQL 5.6.5 e versioni successive NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES in 5.6.6 +

riferimento mysql 5.6


Altre risposte affermano sql_mode := ''di essere possibili. Perché non sei d'accordo?
Hermann Döppes,

Da dove provengono tutte quelle opzioni nella tua stringa? Qual è il ragionamento alla base di questo?
Hermann Döppes,

Secondo la documentazione di MySQL 5.6, sql_mode è l'impostazione predefinita è stringa vuota in MySQL 5.6.5 e ritorno NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES in 5.6.6 dev.mysql.com/doc/refman/5.6/en/…
Salvatore Napoli

Grazie ha funzionato per me su Ubuntu 16.04 - mysql Ver 14.14 Distrib 5.7.18, per Linux (x86_64) usando il wrapper EditLine
Paul Preibisch

12

Su MySQL 5.7 e Ubuntu 16.04, modifica il file mysql.cnf.

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

Includi sql_mode come il seguente e salva il file.

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

Tieni presente che, nel mio caso, ho rimosso la modalità STRICT_TRANS_TABLES e ONLY_FULL_GROUP_BY.

In questo modo, salverà la configurazione della modalità in modo permanente. Diversamente se aggiorni @@ sql_mode tramite MySQL, perché verrà ripristinato al riavvio della macchina / servizio.

Dopodiché, per agire sulla configurazione modificata, riavvia il servizio mysql:

$ sudo service mysql restart

Prova ad accedere al mysql:

$ mysql -u user_name -p

Se sei in grado di accedere e accedere alla console MySQL, è ok. Grande!

MA , se come me, dovessi riscontrare l'errore "variabile sconosciuta sql_mode" , che indica che sql_mode è un'opzione per mysqld , dovrai tornare indietro, modificare nuovamente il file mysql.cnf e cambiare [mysql]in [mysqld]. Riavviare il servizio MySQL ed eseguire un ultimo test tentando di accedere alla console MySQL. Ecco qui!


1
Consiglio vivamente l'approccio sopra menzionato piuttosto che impostarlo sulla sessione, grazie a @ alexandre-ribeiro. Per coloro che hanno Ubuntu 16.04 e mysql 5.7.x, modifica meglio il file e inserisci la direttiva ini sql_mode = <le modalità> nel gruppo [mysqld] , poiché dichiarare contro [mysql] non funziona, secondo la mia esperienza.
codarrior,

Ho MySQL 5.7.22. È strano, ma ho dovuto rimuovere sia STRICT_TRANS_TABLES che ONLY_FULL_GROUP_BY dalla dichiarazione sql_mode in my.cnf, come mostrato sopra, perché funzioni. In realtà, voglio solo rimuovere la modalità ONLY_FULL_GROUP_BY. Se faccio "set global / session sql_mode = ..." posso rimuovere solo ONLY_FULL_GROUP_BY senza dover rimuovere STRICT_TRANS_TABLES affinché funzioni. Ma dal momento che questo non sopravvive si riavvia, quindi non mi serve molto.
RayCh,

12

Questo è quello che ho eseguito per correggere su Mysql workbench:

Prima ho ottenuto il valore corrente con il comando seguente

SELECT @@sql_mode 

successivamente ho rimosso la chiave ONLY_FULL_GROUP_BY dall'elenco e ho incollato il comando seguente

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'

10

Per Mac OS Mojave (10.14) Apri terminale

$ 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

Incolla quanto segue:

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

Tasti di scelta rapida per salvare ed uscire da nano: Ctrl+xe yeEnter

Nota: potrebbe essere necessario eseguire l'aggiornamentomysql-5.7.24-macos10.14-x86_64in questi comandi, basta controllare il nome della cartella corretta all'interno/usr/local/

Spero che possa aiutare qualcuno!


10

Aggiungi o rimuovi modalità a sql_mode

MySQL 5.7.9 o successivo

Per aggiungere o rimuovere una modalità sql_mode, è possibile utilizzare list_adde le list_dropfunzioni.

Per rimuovere una modalità dalla corrente SESSION.sql_mode, è possibile utilizzare una delle seguenti:

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

Per rimuovere una modalità GLOBAL.sql_modeche persiste per l' operazione di runtime corrente , fino al riavvio del servizio .

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

MySQL 5.7.8 o precedente

Poiché il sql_modevalore è una stringa di modalità CSV, è necessario assicurarsi che la stringa non contenga virgole residue, che è possibile ottenere utilizzando TRIM(BOTH ',' FROM ...).

Per rimuovere una modalità dalla sql_modevariabile, si desidera utilizzare REPLACE()insieme TRIM()per assicurarsi che vengano rimosse eventuali virgole residue.

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

Per aggiungere una modalità alla sql_modevariabile, si desidera utilizzare CONCAT_WS(',', ...), per assicurarsi che una virgola sia aggiunta alle modalità correnti e TRIM()per assicurarsi che vengano rimosse eventuali virgole residue.

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

NOTA: la modifica della GLOBALvariabile non si propaga alla SESSIONvariabile fino a quando non viene stabilita una nuova connessione.

La GLOBALvariabile persisterà fino al riavvio del servizio in esecuzione.

La SESSIONvariabile persisterà per la connessione corrente, fino a quando la connessione non viene chiusa e non viene stabilita una nuova connessione.


Invertire GLOBAL.sql_mode

Poiché è SET sql_mode = 'ONLY_FULL_GROUP_BY';stato eseguito senza il GLOBALmodificatore, la modifica ha interessato solo il SESSIONvalore dello stato corrente , che riguarda anche @@sql_mode. Per rimuoverlo e ripristinare il valore predefinito globale al riavvio del server , si desidera utilizzare il valore da @@GLOBAL.sql_mode. [sic]

Il SESSIONvalore corrente è valido solo per la connessione corrente. La riconnessione al server ripristinerà il valore al GLOBAL valore.

Per ripristinare il valore dello stato della sessione corrente sul valore globale corrente, è possibile utilizzare uno dei seguenti:

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

Cambia SESSION.sql_modevalore 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 |
+--------------------+----------------------------------------------+

Ripristina il SESSION.sql_modevalore sul GLOBAL.sql_modevalore

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

Riavvio server persistente sql_mode

Per impostare la modalità SQL all'avvio del server, utilizzare l' --sql-mode="modes"opzione nella riga di comando o sql-mode="modes"in un file di opzioni come my.cnf (sistemi operativi Unix) o my.ini (Windows). [sic]

Consulta la tua versione di MySQL per determinare le modalità supportate e predefinite .

[mysqld]

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

sql_modeValori predefiniti

Poiché i valori per versione della documentazione di MySQL sono stati rimossi, li ho aggiunti qui come riferimento.

MySQL> = 8.0.11 8.0.5 - 8.0.10 Saltato

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

''

8

Se si utilizza MySQL 8.0.11, è necessario rimuovere "NO_AUTO_CREATE_USER" da sql-mode.

Aggiungi la seguente riga nel file /etc/mysql/my.cnfe nell'intestazione [mysqld]

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

finora questa risposta funziona per 8.0.13
tomexsans,

7

Sto usando dottrine e ho aggiunto driverOptions nel mio 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',''))"
                ),
            ),
        ),
    ),
));

In phpmyadmin l'utente deve attivare SUPER nei privilegi.


3
Usando la notazione yaml per configurare Doctrine (come fatto in Symfony) devi usare "1002" invece della costante "PDO :: MYSQL_ATTR_INIT_COMMAND", ma questo è quello che stavo cercando poche settimane fa e non sono riuscito a trovare su. Grazie per la tua soluzione! Ha funzionato per me.
Arvid,

5

A chi esegue un VPS / Server con cPanel / WHM , è possibile effettuare le seguenti operazioni per disabilitare permanentemente ONLY_FULL_GROUP_BY

È necessario l'accesso root (su un VPS o un server dedicato)

  1. Immettere WHM come root ed eseguire phpMyAdmin

  2. Fai clic su Variabili, cerca sql_mode, fai clic su "Modifica" e copia l'intera riga all'interno di quella casella di testo

ad es. copia questo:

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. Connettiti al tuo server tramite SFTP - SSH (root) e scarica il file /etc/my.cnf

  2. Apri con un my.cnffile dell'editor di testo sul tuo PC locale e incolla (sotto la [mysqld]sezione) l'intera riga che hai copiato al passaggio (2) ma rimuoviONLY_FULL_GROUP_BY,

es. incolla questo:

# 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. Salvare il my.cnffile e caricarlo nuovamente in/etc/

  2. Immettere WHM e andare su "WHM> Riavvia servizi> SQL Server (MySQL)" e riavviare il servizio


4

Sto lavorando con mysql e registrato con l'utente root, la soluzione che funziona per me è la seguente:

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


3

Questa è una soluzione permanente per MySql 5.7+ su 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

Se riesci ad accedere senza errori, dovresti essere pronto per ora.


1

Puoi disabilitarlo usando il file di configurazione my.cnf:

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

Quindi in macOS 10.12, è a usr/local/etc/my.cnf. Puoi modificare sql_modequi:

# 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"

1

Ecco la mia soluzione che cambia la configurazione di Mysql attraverso il dashboard di phpmyadmin:

Per correggere "questo è incompatibile con sql_mode = only_full_group_by": Apri phpmyadmin e vai alla Home Page e seleziona il sottomenu 'Variabili'. Scorri verso il basso per trovare la modalità sql. Modifica la modalità sql e rimuovi 'ONLY_FULL_GROUP_BY' Salva.


0

con MySQL versione 5.7.28 verificare utilizzando
SELECT @@sql_mode; e aggiornare con

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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.