Désactiver ONLY_FULL_GROUP_BY

615

J'ai activé accidentellement le mode ONLY_FULL_GROUP_BY comme ceci:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Comment le désactiver?

ZviBar
la source
39
As-tu essayé SET sql_mode = ''?
Tripp Kinetics
4
Pourquoi voudriez-vous désactiver un mode qui rend MySQL plus conforme aux normes SQL, et un autre, qui vous apprend à être plus prudent lors de l'écriture de vos requêtes?
Andriy M
34
Depuis Mysql 5.7, vous pouvez également utiliser la fonction ANY_VALUE ( column) pour adapter votre requête. Voir le doc ici
Qoheleth-Tech
3
@AndriyM Je vais devoir l'utiliser bientôt car je porte une charge entière d'anciennes applications vers un nouveau serveur et elles doivent fonctionner, que j'en ai la source ou non.
Jaydee
8
@AndriyM Parce que si je regroupe par une colonne d'index unique, alors JE SAIS DÉJÀ que chaque ligne sera unique - en ajoutant un groupe distinct par commande pour chaque. Célibataire. colonne. dans le tableau est une douleur royale.
Benubird

Réponses:

1163

Solution 1: supprimer ONLY_FULL_GROUP_BY de la console mysql

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

vous pouvez en savoir plus ici

Solution 2: supprimer ONLY_FULL_GROUP_BY de phpmyadmin

  • Ouvrez phpmyadmin et sélectionnez localhost
  • Cliquez sur le menu Variables et faites défiler vers le bas pour le mode sql
  • Cliquez sur le bouton Modifier pour modifier les valeurs et supprimer ONLY_FULL_GROUP_BY et cliquez sur Enregistrer. entrez la description de l'image ici
Eyo Okon Eyo
la source
12
Cette solution fonctionne très bien sur mySQL 5.7.11 et devrait être la solution acceptée. La réponse acceptée ne fonctionne pas sur la nouvelle version de mySQL
Anyone_ph
4
Juste assuré. Peu importe REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), MySQL supprime de toute façon les virgules indésirables de l'enregistrement. La réponse d'OP est correcte.
nawfal
40
Cela fonctionne, mais lorsque je redémarre le serveur mysql, les valeurs par défaut sont restaurées ... pourquoi? existe-t-il une solution persistante? Merci!
Vincent Pazeller
52
Pour répondre à ma question (solution persistante): vous devez mettre la description de sql_mode dans un fichier my.cnf (/etc/my.cnf par exemple) et redémarrer le serveur. Par exemple, insérez (sous la section [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 Pazeller44
21
GLOBALn'a pas fonctionné pour moi, mais SESSIONa fonctionné. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre
371

Mise à jour:

entrez la description de l'image ici

Pour conserver vos paramètres mysql actuels et les désactiver, ONLY_FULL_GROUP_BYje vous suggère de visiter votre phpmyadmin ou tout autre client que vous utilisez et tapez:

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

résultat de la copie suivante dans votre my.inifichier.

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

Ubuntu 16 et plus :sudo nano /etc/mysql/my.cnf

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

Mise en garde! copy_meLe résultat peut contenir un long texte qui pourrait être coupé par défaut. Assurez-vous de copier le texte entier!


ancienne réponse:

Si vous souhaitez désactiver définitivement l' erreur " Expression #N de la liste SELECT n'est pas dans la clause GROUP BY et contient la colonne non agrégée 'db.table.COL' qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY; cela est incompatible avec sql_mode = only_full_group_by "procédez comme suit:

  1. sudo nano /etc/mysql/my.cnf
  2. Ajoutez ceci à la fin du fichier

    [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 redémarrer MySQL

Cela désactivera ONLY_FULL_GROUP_BYpour TOUS les utilisateurs

breq
la source
2
pour moi, définir la balise mysqld sur la même ligne n'a pas fonctionné, mais cela a fonctionné avec un saut de ligne :) merci
bloub
23
Pour ubuntu, le fichier contenant les valeurs de configuration personnalisées est/etc/mysql/mysql.conf.d/mysqld.cnf
knb
5
Cela a fonctionné pour Ubuntu 16.04 (14 à 16 problèmes de mise à niveau ..). Le fichier /etc/mysql/my.cnf est le fichier correct. Le fichier mentionné par knb est inclus dans ce fichier my.cnf, au moins en 16.04 (la configuration est maintenant divisée en plusieurs fichiers).
jwinn
2
Utilisez "SELECT @@ sql_mode;" pour voir quels modes sont actuellement activés avant d'apporter des modifications.
Zbigniew Ledwoń
1
l'endroit réel où vous verrez [mysqld]peut ne pas être dans ce fichier, il peut être dans un répertoire include. Utilisez d'abord cette commande: grep -R "\[mysqld\]" *pour voir ce qui s'y trouve - et d'ailleurs essayezgrep -R "\bsql_mode\b" *
Oliver Williams
203

Soyez prudent en utilisant

SET sql_mode = '' 

Cela efface en fait tous les modes actuellement activés. Si vous ne voulez pas jouer avec d'autres paramètres, vous voudrez faire un

SELECT @@sql_mode 

tout d'abord, pour obtenir une liste séparée par des virgules des modes activés, puis définissez-la sur cette liste sans l' ONLY_FULL_GROUP_BYoption.

Taran
la source
Quelle est la meilleure façon de procéder then SET it to this list without the ONLY_FULL_GROUP_BY option.:?
Kevin Meredith
4
@KevinMeredith ma lecture des documents est qu'il n'y a aucun moyen d'activer / désactiver un mode à la fois - tous les exemples vous demandent de fournir une liste séparée par des virgules de ceux que vous voulez - par exempleSET 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
S'il s'agit d'un changement permanent, modifiez my.cnf avec une ligne comme celle-ci:, sql_mode=<comma-separated-list>puis arrêtez et démarrez votre serveur. Suivez les documents de votre système d'exploitation pour l'emplacement et la meilleure façon de modifier my.cnf.
blackwood
107

Essayez ceci:

SET sql_mode = ''

Remarque de la communauté: Comme indiqué dans les réponses ci-dessous, cela efface en fait tous les modes SQL actuellement activés. Ce n'est pas nécessairement ce que vous voulez.

Tripp Kinetics
la source
11
Wow, ''= 'full group by is disabled'? MySQL fait des choses assez stupides mais celle-là est là-haut.
Aaron Bertrand
38
Je pense que cela désactive essentiellement tout mode SQL;
ZviBar
Ça n'a pas marché pour moi. Je vois 0 rows affectedet ma requête ne fonctionne toujours pas:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber
10
Avant d'essayer cette réponse, regardez définitivement l'avertissement de Machavity et si vous voulez que les modifications persistent, assurez-vous de les utiliser globaldans la commande .
thomas88wp
6
Chaque fois que je reviens à MySql après un certain temps, je rencontre toujours ce problème qui m'agace, car j'oublie toujours quel est le problème :) Le sentiment est juste décevant, quand on pense que ça fonctionnait et maintenant ça ne marche plus à cause du changement de version.
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
la source
@ RémiBreton: quelle est ta version mysql?
WeiYuan
6
Cela fonctionne en effet. Mais après avoir redémarré mon système (Ubuntu 16.04), le sql_moderetour à la valeur précédente. Que puis-je faire maintenant?
pktangyue
génial, a fonctionné pour moi, j'ai juste besoin de le convertir en permanence
Fernando Torres
74

Ajout d'un seul mode à sql_mode sans supprimer les modes existants:

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

Supprimer uniquement un mode spécifique de sql_mode sans en supprimer d'autres:

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

Dans votre cas, si vous souhaitez supprimer uniquement le ONLY_FULL_GROUP_BYmode, utilisez la commande ci-dessous:

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

Référence: http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html

Janaka R Rajapaksha
la source
C'est une excellente réponse! Merci.
wedi
1
Est-ce global ou sur la connexion actuelle? Très bonne réponse!
Oliver M Grech
48

Merci à @cwhisperer. J'ai eu le même problème avec Doctrine dans une application Symfony. Je viens d'ajouter l'option à mon 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',''))"

CA marchait bien pour moi.

Arvid
la source
1
Et si besoin de combiner avec SET NAMES 'utf8', utilisez "SET NAMES 'utf8', sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));". Si deux requêtes sont utilisées à la place, comme "SET NAMES 'utf8'; SET sql_mod ...", cela générera "Erreur générale: 2014 Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives."
Ventzy Kunev
@VentzyKunev s'il vous plaît ne suivez pas ces conseils et ne définissez pas en SET NAMESutilisant cette méthode, dans la plupart des cas, il n'est pas nécessaire que symfony le définisse via doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html , et le fait correctement via PDO dns, SET NAMES est une manière obsolète de le faire, qui ne devrait pas être utilisée pour la version PHP supérieure à 5.3
LPodolski
39

Sur:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16, pour Linux (x86_64) utilisant le wrapper EditLine

Faire:

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

Copier et coller:

[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

Au bas du fichier

$ sudo service mysql restart
Jadeye
la source
Le mysql.cnf ne sera-t-il jamais remplacé par une mise à jour de mysql?
cwhisperer
1
@cwhisperer /etc/mysql/mysql.cnfpointe vers 2 dossiers de configuration !includedir /etc/mysql/conf.d/+ !includedir /etc/mysql/mysql.conf.d/. Il en va de même /etc/mysql/my.cnf. Par conséquent, je suppose que les fichiers de configuration ne sont pas remplacés lors de la mise à jour. Vous pouvez en savoir plus icihttp://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye
J'ai essayé cela et cela n'a pas fonctionné sur Ubuntu 18.04.2 bionic. J'ai suivi cela et cela a fonctionné: sitepoint.com/… - peut-être qu'il est important d'utiliser ce format avec des espaces et des guillemets: sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"peut - être qu'il est important de créer un nouveau fichier à la /etc/mysql/mysql.conf.d/mysqld_mode.cnfplace
rubo77
Cela fonctionne même après le redémarrage du serveur mysql
Akshay Khale
36

J'ai remarqué que la solution @Eyo Okon Eyo fonctionne tant que le serveur MySQL n'est pas redémarré, puis les paramètres par défaut sont restaurés. Voici une solution permanente qui a fonctionné pour moi:

Pour supprimer un mode SQL particulier (dans ce cas, ONLY_FULL_GROUP_BY ), recherchez le mode SQL actuel:

SELECT @@GLOBAL.sql_mode;

copiez le résultat et supprimez-en ce dont vous n'avez pas besoin ( ONLY_FULL_GROUP_BY )

par exemple:

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

à

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

créez et ouvrez ce fichier:

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

et y écrire et y coller votre nouveau mode 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

redémarrez MySQL:

sudo service mysql restart

Ou vous pouvez utiliser ANY_VALUE()pour supprimer le rejet de valeur ONLY_FULL_GROUP_BY, vous pouvez en savoir plus ici

Waqleh
la source
3
PourANY_VALUE()
Sithu
25

La documentation MySQL spécifie également les méthodes suivantes:

  • Défini sql-mode="<modes>"dans un fichier d'options tel que my.cnf (systèmes d'exploitation Unix) ou my.ini (Windows).
  • Pour définir le mode SQL au démarrage du serveur via la ligne de commande, utilisez l' --sql-mode="<modes>"option.

* Où se <modes>trouve une liste de différents modes séparés par des virgules.

Pour effacer explicitement le mode SQL, définissez-le sur une chaîne vide à l'aide --sql-mode=""de la ligne de commande ou sql-mode=""dans un fichier d'options.

J'ai ajouté l' sql-mode=""option à /etc/my.cnfet cela a fonctionné.

Cette solution SO explique comment trouver le fichier my.cnf utilisé par MySQL.

N'oubliez pas de redémarrer MySQL après avoir apporté des modifications.

br3nt
la source
1
c'est la bonne réponse pour moi `Ver 14.14 Distrib 5.7.10, pour osx10.11 (x86_64)`
Sinux
cela devrait être marqué comme la bonne réponse. Les autres réponses ne fournissent pas de solution permanente.
sijpkes
@ br3nt Comment puis-je détecter quels sont les modes actuels utilisés pour que je puisse simplement supprimer les modes indésirables au cas où je ne voudrais pas désactiver tous les modes?
simgineer
1
EssayezSELECT @@GLOBAL.sql_mode;
br3nt
19

Si vous utilisez WAMP. Cliquez avec le bouton gauche de la souris sur l'icône WAMP, puis passez à MySQL -> Paramètres MySQL -> sql-mode, puis sélectionnez sql-mode-> user mode

Commander cette image

Shiran Gabriel
la source
Y a-t-il une raison pour laquelle je n'ai pas de paramètres MySQL dans mon installation WAMP? Il y a l'administration du service et la console MySQL mais pas de paramètres?
Craig
Ceci est exactement ce que je cherchais! Merci d'avoir fourni une solution de serveur WAMP simple! J'en avais besoin en essayant de faire # agrégation dans ce tutoriel: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010
12

Sur mon SQL (version 5.7.11 fonctionnant sous Mac OS X), cela fonctionne pour moi sur le 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"

Selon la documentation MySQL 5.6, sql_mode est par défaut est

chaîne vide dans MySQL 5.6.5 et retour NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES dans 5.6.6 +

référence mysql 5.6

Salvatore Napoli
la source
D'autres réponses prétendent sql_mode := ''être possibles. Pourquoi êtes-vous en désaccord?
Hermann Döppes
D'où viennent toutes ces options dans votre chaîne? Quel est le raisonnement derrière cela?
Hermann Döppes
Selon la documentation MySQL 5.6, sql_mode est par défaut une chaîne vide dans MySQL 5.6.5 et retour NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES dans 5.6.6 dev.mysql.com/doc/refman/5.6/en/…
Salvatore Napoli
Merci a travaillé pour moi sur Ubuntu 16.04 - mysql Ver 14.14 Distrib 5.7.18, pour Linux (x86_64) en utilisant le wrapper EditLine
Paul Preibisch
12

Sur MySQL 5.7 et Ubuntu 16.04, éditez le fichier mysql.cnf.

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

Incluez le sql_mode comme suit et enregistrez le fichier.

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

Notez que, dans mon cas, j'ai supprimé le mode STRICT_TRANS_TABLES et le ONLY_FULL_GROUP_BY.

Ce faisant, il enregistrera la configuration du mode de façon permanente. Différemment si vous venez de mettre à jour le @@ sql_mode via MySQL, car il se réinitialisera au redémarrage de la machine / du service.

Après cela, pour que la configuration modifiée entre en action, redémarrez le service mysql:

$ sudo service mysql restart

Essayez d'accéder au mysql:

$ mysql -u user_name -p

Si vous pouvez vous connecter et accéder à la console MySQL, c'est ok. Génial!

MAIS , si comme moi, vous faites face à l'erreur "variable inconnue sql_mode" , qui indique que sql_mode est une option pour mysqld , vous devrez revenir en arrière, éditer à nouveau le fichier mysql.cnf et changer le [mysql]en [mysqld]. Redémarrez le service MySQL et faites un dernier test en essayant de vous connecter sur la console MySQL. C'est ici!

Alexandre Ribeiro
la source
1
Je recommanderais fortement l'approche susmentionnée plutôt que de la mettre sur la session, grâce à @ alexandre-ribeiro. Pour ceux qui ont Ubuntu 16.04 et mysql 5.7.x, mieux éditez le fichier et entrez le directive ini sql_mode = <les modes> sous le groupe [mysqld] , car déclarer contre [mysql] ne fonctionne pas, selon mon expérience.
codarrior
J'ai MySQL 5.7.22. C'est étrange, mais j'ai dû supprimer à la fois STRICT_TRANS_TABLES et ONLY_FULL_GROUP_BY de la déclaration sql_mode dans mon.cnf, comme indiqué ci-dessus, pour que cela fonctionne. En réalité, je souhaite uniquement supprimer le mode ONLY_FULL_GROUP_BY. Si je fais "set global / session sql_mode = ..." je peux supprimer juste ONLY_FULL_GROUP_BY sans avoir à supprimer STRICT_TRANS_TABLES pour que cela fonctionne. Mais comme cela ne survit pas au redémarrage, cela ne m'est donc pas très utile.
RayCh
12

Voici ce que j'ai effectué pour corriger sur le plan de travail Mysql:

Avant d'obtenir la valeur actuelle avec la commande ci-dessous

SELECT @@sql_mode 

plus tard, j'ai supprimé la clé ONLY_FULL_GROUP_BY de la liste et j'ai collé la commande ci-dessous

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
la source
11

Ajouter ou supprimer des modes à sql_mode

MySQL 5.7.9 ou version ultérieure

Pour ajouter ou supprimer un mode sql_mode, vous pouvez utiliser list_addetlist_drop fonctions .

Pour supprimer un mode de l'actuel SESSION.sql_mode, vous pouvez utiliser l'une des options suivantes:

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

Pour supprimer un mode du GLOBAL.sql_modequi persiste pour le runtime actuel opération d' cours, jusqu'au redémarrage du service .

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

MySQL 5.7.8 ou antérieur

Depuis le sql_mode valeur est une chaîne de modes CSV, vous devez vous assurer que la chaîne ne contient pas de virgules résiduelles, ce qui peut être accompli en utilisantTRIM(BOTH ',' FROM ...) .

Pour supprimer un mode de la sql_modevariable, vous souhaitez utiliserREPLACE() avec TRIM()pour vous assurer que toutes les virgules résiduelles sont supprimées.

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

Pour ajouter un mode à la sql_modevariable, vous voudriez utiliser CONCAT_WS(',', ...), pour vous assurer qu'une virgule est ajoutée aux modes actuels etTRIM() pour s'assurer que toutes les virgules résiduelles sont supprimées.

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

REMARQUE: la modification de la GLOBALvariable ne se propage pas à la SESSIONvariable tant qu'une nouvelle connexion n'est pas établie.

La GLOBALvariable persistera jusqu'au redémarrage du service en cours d'exécution.

La SESSIONvariable persistera pour la connexion actuelle, jusqu'à ce que la connexion soit fermée et qu'une nouvelle connexion soit établie.


Revenir à GLOBAL.sql_mode

Puisque a SET sql_mode = 'ONLY_FULL_GROUP_BY';été exécuté sans le GLOBALmodificateur, le changement n'a affecté que la SESSIONvaleur d'état actuelle , qui se rapporte également à @@sql_mode. Pour le supprimer et revenir à la valeur par défaut globale au redémarrage du serveur , vous souhaitez utiliser la valeur de @@GLOBAL.sql_mode. [sic]

La SESSIONvaleur actuelle n'est valable que pour la connexion actuelle. La reconnexion au serveur ramènera la GLOBAL valeur à la valeur.

Pour rétablir la valeur d'état de session actuelle à la valeur globale actuelle, vous pouvez utiliser l'une des options suivantes:

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

Changer la SESSION.sql_modevaleur enONLY_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 |
+--------------------+----------------------------------------------+

Rétablir la SESSION.sql_modevaleur à la GLOBAL.sql_modevaleur

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

Redémarrage du serveur persistant sql_mode

Pour définir le mode SQL au démarrage du serveur, utilisez l' --sql-mode="modes"option sur la ligne de commande ou sql-mode="modes"dans un fichier d'options tel que my.cnf (systèmes d'exploitation Unix) ou my.ini (Windows). [sic]

Veuillez consulter votre version de MySQL pour déterminer les modes pris en charge et par défaut .

[mysqld]

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

sql_modeValeurs par défaut

Étant donné que les valeurs par version de la documentation MySQL ont été supprimées, je les ai ajoutées ici pour référence.

MySQL> = 8.0.11 8.0.5 - 8.0.10 ignoré

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
la source
10

Pour Mac OS Mojave (10.14) Terminal ouvert

$ 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

Collez ce qui suit:

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

Raccourcis pour enregistrer et quitter nano: Ctrl+xet yetEnter

Remarque: vous devrez peut-être mettre à jourmysql-5.7.24-macos10.14-x86_64ces commandes, vérifiez simplement le nom de dossier correct que vous avez obtenu dans/usr/local/

J'espère que cela aidera quelqu'un!

AamirR
la source
8

Si vous utilisez MySQL 8.0.11, vous devez supprimer le 'NO_AUTO_CREATE_USER' du mode sql.

Ajouter la ligne suivante dans le fichier /etc/mysql/my.cnfet l'en-tête [mysqld]

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Hiren Bhut
la source
jusqu'à présent cette réponse fonctionne pour 8.0.13
tomexsans
7

J'utilise doctrine et j'ai ajouté les options driverOptions dans mon 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',''))"
                ),
            ),
        ),
    ),
));

Dans phpmyadmin, l'utilisateur a besoin de SUPER activé dans les privilèges.

cwhisperer
la source
3
En utilisant la notation yaml pour configurer Doctrine (comme cela est fait dans Symfony), vous devez utiliser "1002" au lieu de la constante "PDO :: MYSQL_ATTR_INIT_COMMAND", mais néanmoins c'est ce que je cherchais il y a quelques semaines et je n'ai pas pu trouver en dehors. Merci pour votre solution! A travaillé pour moi.
Arvid
5

À qui exécute un VPS / serveur avec cPanel / WHM , vous pouvez effectuer les opérations suivantes pour désactiver définitivement ONLY_FULL_GROUP_BY

Vous avez besoin d'un accès root (soit sur un VPS soit sur un serveur dédié)

  1. Entrez WHM en tant que root et exécutez phpMyAdmin

  2. Cliquez sur Variables, recherchez sql_mode, cliquez sur «Modifier» et copiez la ligne entière à l' intérieur de cette zone de texte

par exemple, copiez ceci:

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. Connectez-vous à votre serveur via SFTP - SSH (root) et téléchargez le fichier /etc/my.cnf

  2. Ouvrez avec un my.cnffichier éditeur de texte sur votre PC local et collez-y (sous la [mysqld]section) toute la ligne que vous avez copiée à l'étape (2) mais supprimezONLY_FULL_GROUP_BY,

par exemple collez ceci:

# 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. Enregistrez le my.cnffichier et téléchargez-le dans/etc/

  2. Entrez WHM et allez dans "WHM> Redémarrer les services> SQL Server (MySQL)" et redémarrez le service

Marco Demaio
la source
4

Im travaillant avec mysql et enregistré avec l'utilisateur root, la solution qui fonctionne pour moi est la suivante:

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

Jorge Santos Neill
la source
3

Il s'agit d'une solution permanente pour MySql 5.7+ sur 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

Si vous êtes en mesure de vous connecter sans erreur - vous devriez être prêt maintenant.

demisx
la source
1

Vous pouvez le désactiver en utilisant le fichier de configuration my.cnf:

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

Donc, dans macOS 10.12, c'est à usr/local/etc/my.cnf. Vous pouvez éditer sql_modeici:

# 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
la source
1

Voici ma solution modifiant la configuration de Mysql via le tableau de bord phpmyadmin:

Pour corriger "ceci est incompatible avec sql_mode = only_full_group_by": Ouvrez phpmyadmin et allez à la page d'accueil et sélectionnez le sous-menu "Variables". Faites défiler vers le bas pour trouver le mode sql. Modifiez le mode SQL et supprimez «ONLY_FULL_GROUP_BY». Enregistrez-le.

Marcello Perri
la source
0

avec MySQL version 5.7.28 vérifier en utilisant
SELECT @@sql_mode; et mettre à jour avec

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
la source