web-dev-qa-db-fra.com

Désactiver ONLY_FULL_GROUP_BY

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

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Comment puis-je le désactiver?

418
ZviBar

Solution 1: Supprimez ONLY_FULL_GROUP_BY de la console mysql

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

vous pouvez en lire 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 & cliquez sur enregistrer . enter image description here
820
Eyo Okon Eyo

Soyez prudent en utilisant 

SET sql_mode = '' 

Ceci efface tous les modes actuellement activés. / Si vous ne voulez pas jouer avec d'autres paramètres, vous voudrez faire une 

SELECT @@sql_mode 

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

177
Taran

Essayez ceci:

SET sql_mode = ''

Note à la communauté: Comme indiqué dans les réponses ci-dessous, cela efface en fait tout les modes SQL actuellement activés. Ce n'est peut-être pas nécessairement ce que vous voulez.

93
Tripp Kinetics
    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;
91
WeiYuan

Ajout d'un seul mode à sql_mode sans supprimer les 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 mode ONLY_FULL_GROUP_BY, 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

56

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.

38
Arvid

Sur:

  • Ubuntu 14.04
  • mySQL Ver 14.14 Distrib 5.7.16, pour Linux (x86_64) à l'aide du 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
26
Jadeye

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

  • Définissez 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'option --sql-mode="<modes>".

* Où <modes> est 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 de --sql-mode="" sur la ligne de commande ou de sql-mode="" dans un fichier d'options.

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

Cette solution SO explique comment déterminer quel fichier my.cnf est utilisé par MySQL.

N'oubliez pas de redémarrer MySQL après avoir effectué les modifications.

22
br3nt

J'ai remarqué que la solution @Eyo Okon Eyo fonctionne tant que le serveur MySQL n'est pas redémarré, 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;

copier le résultat et en supprimer 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 écrivez et collez-y 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 ONLY_FULL_GROUP_BY rejet de valeur, vous pouvez en savoir plus à ce sujet ici

20
Waqleh

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

 Checkout this image

18
Shiran Gabriel

Sous 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 ONLY_FULL_GROUP_BY.

En faisant cela, cela sauvegardera la configuration du mode de façon permanente. Par ailleurs, si vous ne mettez à jour que le @@ sql_mode via MySQL, il sera réinitialisé au redémarrage de la machine/du service.

Après cela, pour que la configuration modifiée prenne des mesures, 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 bon. Génial!

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

10
Alexandre Ribeiro

Sur mon sql (version 5.7.11 sous Mac OS X), cela fonctionne pour moi sur le client mysql Shell:

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 de MySQL 5.6, sql_mode est la valeur par défaut est

chaîne vide dans MySQL 5.6.5 et arrière NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES dans 5.6.6 +

référence mysql 5.6

9
Salvatore Napoli

Si vous utilisez MySQL 8.0.11, vous devez donc supprimer le paramètre "NO_AUTO_CREATE_USER" du mode SQL.

Ajouter la ligne suivante dans le fichier /etc/mysql/my.cnf et 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
5
Hiren Bhut

J'utilise la doctrine et j'ai ajouté les 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 doit activer SUPER dans les privilèges.

5
cwhisperer

C'est 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 parvenez à vous connecter sans erreur, vous devriez être prêt maintenant.

2
demisx

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

Coller suivant:

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

Raccourcis clavier pour enregistrer et quitter nano: Ctrl+x et y et Enter

Remarque:Vous devrez peut-être mettre à jour mysql-5.7.24-macos10.14-x86_64 dans ces commandes, il suffit de vérifier le nom du dossier que vous avez obtenu dans /usr/local/

J'espère que ça va aider quelqu'un!

2
AamirR

Voici ce que j'ai effectué pour résoudre Mysql Workbench:

Avant d'avoir 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'
2
Matt Vegas

Pour qui exécute un serveur VPS/serveur avec cPanel/WHM , vous pouvez procéder comme suit pour désactiver ONLY_FULL_GROUP_BY de manière permanente

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

  1. Entrez WHM en tant que root et lancez phpMyAdmin

  2. Cliquez sur Variables, cherchez sql_mode, cliquez sur 'Modifier' et copiez la ligne entière dans cette zone de texte

par exemple. copier 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 (racine) et téléchargez le fichier /etc/my.cnf

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

par exemple. coller 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 fichier my.cnf et réimportez-le dans /etc/

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

1
Marco Demaio

Je travaille avec mysql et je suis inscrit 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', ''));

0
Jorge Santos Neill

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_mode ici: 

# 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"
0
Dio Phung