MySQL a changé la valeur par défaut de la variable sql_mode depuis les versions précédentes, ce qui casse le code existant dans plusieurs applications. Ce tutoriel explique comment modifier le sql_mode en fonction des fonctionnalités de l'application. Il fournit également les étapes pour conserver cette valeur au redémarrage du serveur.
Remarques :Vous pouvez également suivre les didacticiels MySQL - Comment installer MySQL 8 sur Ubuntu, Comment supprimer complètement MySQL d'Ubuntu et Apprendre les requêtes SQL de base à l'aide de MySQL.
La valeur par défaut de la variable sql_mode dans MySQL 8 est comme indiqué ci-dessous.
# Default - sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Dans mon cas, l'option ONLY_FULL_GROUP_BY casse le code, donc je vais le supprimer pour démonstration
Mettre à jour directement
Nous pouvons directement mettre à jour la valeur de sql_mode en utilisant les commandes comme indiqué ci-dessous.
# Login
mysql -u root -p
# Globally
SET GLOBAL sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
# Session
SET SESSION sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
La valeur sql_mode sera modifiée à l'aide des requêtes mentionnées ci-dessus. Le problème est que la variable récupère sa valeur par défaut au redémarrage du serveur. Nous pouvons conserver la valeur comme indiqué dans la section suivante.
Mettre à jour en permanence
Nous pouvons conserver la valeur de sql_mode en mettant à jour my.cnf dossier. L'emplacement de ce fichier diffère en fonction de l'environnement et de la version du serveur. Les emplacements les plus courants de ce fichier incluent/etc/my.
Sur Linux Mint 18 , l'emplacement du fichier est /
# Search the default config
mysqld --verbose --help | grep -A 1 "Default options"
# Output
Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
Le serveur MySQL examinera les emplacements mentionnés ci-dessus pour les configurations par défaut à la fois au niveau du système et au niveau local. Mettez à jour le fichier my.cnf comme indiqué ci-dessous. J'ai utilisé l'éditeur nano pour la démonstration
# Update my.cnf
sudo nano /etc/mysql/my.cnf
# Scroll down and update the file as shown below
...
...
# # The MySQL Server configuration file. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html # * IMPORTANT: Additional settings that can override those from this file! # The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ [mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
Enregistrez maintenant le fichier et quittez l'éditeur. Assurez-vous d'inclure [mysqld] au-dessus de la variable.
Redémarrez le serveur MySQL pour définir la valeur de la variable sql_mode telle que configurée par nous dans le fichier my.cnf comme indiqué ci-dessus.
# Using init
sudo /etc/init.d/mysqld restart
# OR
sudo /etc/init.d/mysql restart
# Using service
sudo service mysql restart
# Using systemd
sudo systemctl restart mysqld.service
# OR
sudo systemctl restart mysql
Résumé
Dans ce tutoriel, nous avons mis à jour la valeur de la variable MySQL sql_mode et l'a également conservé en permanence au redémarrage du serveur.