121 votes

Définition du mode global sql_mode dans MySQL

J'essaie de définir sql_mode dans MySQL mais il y a une erreur.

Commandement :

set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'
  • N'est-ce pas la bonne façon de définir des modes multiples ?
  • Quels sont les avantages des modes session et global ?
  • Quelle est la solution préférée ?

Différents utilisateurs essaient de mettre à jour la base de données avec des valeurs UNC différentes et, au lieu de définir le mode de session sur NO_BACKSLASH_ESCAPES J'ai pensé qu'il serait judicieux de définir une valeur de mode global pour cela. Est-ce que cela a un sens ?

Veuillez m'en informer.

Gracias.

256voto

Chadwick Meyer Points 382

BTW, si vous définissez des valeurs globales dans MySQL :

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

Cela ne le règlera pas DE FAÇON PERMANENTE et il reviendra en arrière après chaque redémarrage.

Vous devez donc définir ce paramètre dans votre fichier de configuration (par ex. /etc/mysql/my.cnf dans la section [mysqld]), afin que les modifications restent effectives après le redémarrage de MySQL :

Fichier de configuration : /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

MISE À JOUR : les versions plus récentes de Mysql (par exemple 5.7.8 ou plus) peuvent nécessiter une syntaxe légèrement différente :

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

Veillez à ce qu'il y ait un tiret entre sql-mode et non un trait de soulignement, et que les modes sont entre guillemets.

Il faut toujours faire référence à la Docs MySQL para votre pour voir la version options du mode sql .

35voto

JPro Points 1160

Je l'ai résolu.

le mode correct est :

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

34voto

yj18 Points 168

Réglage permanent du mode sql à l'aide du fichier de configuration mysql.

Dans mon cas, je dois modifier le fichier /etc/mysql/mysql.conf.d/mysqld.cnf comme mysql.conf.d est incluse dans /etc/mysql/my.cnf . je modifie ceci sous [mysqld]

[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"

vient d'être supprimée ONLY_FULL_GROUP_BY sql mode car il causait des problèmes.

J'utilise ubuntu 16.04 , php 7 et mysql --version me donne ceci mysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Après cette modification, exécutez les commandes suivantes

sudo service mysql stop
sudo service mysql start

Maintenant, vérifiez les modes sql par cette requête SELECT @@sql_mode et vous devriez obtenir les modes que vous venez de définir.

25voto

Serhii Popov Points 1703

Pour quelqu'un qui cherche cette erreur sur Google pour MySQL 8.

MySQL 8.0.11 supprime le 'NO_AUTO_CREATE_USER' du mode sql.

MySQL 5.7 : Utilisation de GRANT pour créer des utilisateurs. Utilisez plutôt CREATE USER. Cette pratique rend le mode SQL NO_AUTO_CREATE_USER est sans importance pour les instructions GRANT, et il est donc lui aussi obsolète. MySQL 8.0.11 : Utilisation de GRANT pour créer des utilisateurs. A la place, utilisez CREATE USER. En suivant cette pratique, le mode SQL NO_AUTO_CREATE_USER immatériel pour les instructions GRANT, il est donc également supprimé.

Tiré de aquí

Ainsi, votre sql_mode peut se présenter comme suit :

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Ou si vous utilisez Docker, vous pouvez ajouter la commande suivante à docker-compose.yml

  mysql:
    image: mysql:8.0.13
    command: --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - 13306:${MYSQL_PORT}

17voto

Devraj Gupta Points 174

Copier dans le fichier de configuration : /etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

MySQL redémarrer.

Vous pouvez aussi faire

[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

MySQL redémarrer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X