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?
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
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
.
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.
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;
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
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.
Sur:
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
La documentation MySQL spécifie également les méthodes suivantes:
sql-mode="<modes>"
dans un fichier d'options tel que my.cnf (systèmes d'exploitation Unix) ou my.ini (Windows).--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.
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
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!
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 +
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
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.
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.
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!
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'
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é)
Entrez WHM en tant que root et lancez phpMyAdmin
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
Connectez-vous à votre serveur via SFTP - SSH (racine) et téléchargez le fichier /etc/my.cnf
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
Enregistrez le fichier my.cnf
et réimportez-le dans /etc/
Entrez WHM et accédez à "WHM> Redémarrer les services> SQL Server (MySQL)" et redémarrez le service.
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', ''));
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"