f4b1.com
***

MySQL : comment changer la configuration de sql_mode pour une session

By Admin on 2017-07-15 13:33:21

Nombre de vues : 22209


Cet article ne sera pas vraiment un tutoriel mais plus une note pour moi ainsi que ceux qui seraient intéressés et passeraient dans le coin. En effet il est parfois nécessaire de changer les valeurs de la variable sql_mode pour pouvoir exécuter certaines requêtes. Cela m'est par exemple récemment arrivé en voulant faire un GROUP BY et HAVING qui permettait de lister les doublons de ma table SQL tout en voulant afficher des colonnes en plus pour avoir des informations supplémentaires.

Mais alors que la requête paraissait tout ce qu'il y a de plus correct, j'ai eu une belle erreur :

  1. ERROR 1055 (42000): Expression #3 OF SELECT list IS NOT IN GROUP BY
  2. clause AND contains nonaggregated COLUMN 'db.table.colonne'
  3. which IS NOT functionally dependent ON COLUMNS IN GROUP BY clause;
  4. this IS incompatible WITH sql_mode=only_full_group_by

Dommage alors que je voulais simplement faire une petite requête pour voir si mon import s'était bien passé ... Je ne voulais pas perdre de temps et j'ai vu qu'il existait en fait une solution toute simple pour résoudre ce problème sachant qu'en plus cela ne va pas aller modifier la configuration de votre serveur.

Attention il s'agit bien là d'un simple petit dépannage et il faudra bien réfléchir avant de faire des modifications en dur dans le fichier my.cnf ou my.ini selon le système d'exploitation que vous utilisez. Mais cela est parfois nécessaire pour certains scripts ou CMS qui ont besoin de réglages particuliers à ce niveau. La commande que j'ai du lancer est donc la suivante :

  1. mysql> SET sql_mode='';

Elle permet donc de supprimer les différentes informations concernant sql_mode mais cela se limite à la session en cours ! J'ai ainsi pu effectuer ma requête sans encombres par la suite ce qui est plutôt une bonne nouvelle. Vous pouvez le vérifier en tapant la commande suivante :

  1. mysql> SELECT @@SESSION.sql_mode;

Qui va alors vous renvoyer une ligne vide ce qui semble plutôt logique puisque nous venons de vider cette variable :

  1. +--------------------+
  2. | @@SESSION.sql_mode |
  3. +--------------------+
  4. | |
  5. +--------------------+
  6. 1 ROW IN SET (0.00 sec)

Par contre, si l'on vérifie pour le paramètre global, on remarque que toutes les options du sql_mode sont toujours présentes :

  1. mysql> SELECT @@GLOBAL.sql_mode;
  2. +--------------------------------------------------+
  3. | @@GLOBAL.sql_mode |
  4. +--------------------------------------------------+
  5. ONLY_FULL_GROUP_BY,
  6. STRICT_TRANS_TABLES,
  7. NO_ZERO_IN_DATE,
  8. NO_ZERO_DATE,
  9. ERROR_FOR_DIVISION_BY_ZERO,
  10. NO_AUTO_CREATE_USER,
  11. NO_ENGINE_SUBSTITUTION
  12. +--------------------------------------------------+
  13. 1 ROW IN SET (0.00 sec)

Articles de la même catégorie :