définition du mode global sql_mode dans mysql

91

J'essaie de définir sql_mode dans mysql mais cela génère une erreur.

Commander:

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 plusieurs modes? Quels sont les avantages de définir les modes session et global? qui est préféré? J'ai différents utilisateurs qui essaient de mettre à jour la base de données avec différentes valeurs UNC et insted od de définir le mode de session sur `` NO_BACKSLASH_ESCAPES '', j'ai pensé qu'il serait logique de créer un mode gloabl pour cela. Est-ce que ça a du sens?

S'il vous plaît, faites-moi savoir.

Merci.

JPro
la source
Ces citations erronées me dérangent vraiment; p. Comme d'autres l'ont dit, j'en suis sûr, ce n'est certainement pas juste à cause de cela.
dyasta

Réponses:

205

BTW, si vous définissez des globaux dans MySQL:

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

Cela ne le définira pas de manière PERMANENTE et il reviendra après chaque redémarrage.

Vous devez donc définir ceci dans votre fichier de configuration (par exemple /etc/mysql/my.cnfdans la section [mysqld]), afin que les modifications restent en vigueur 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 supérieur) peuvent nécessiter une syntaxe légèrement différente:

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

Assurez-vous qu'il y a un tiret entre sql-modepas un trait de soulignement et que les modes sont entre guillemets.

Faites toujours référence aux documents MySQL de votre version pour voir les options du mode SQL .

Chadwick Meyer
la source
2
Merci, la configuration dans my.cnf a fait l'affaire pour moi. Pour les personnes intéressées, cette page vous indique quels sont les sql_modes par défaut dans 5.7 et plus: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Richard
2
Note de la version 5.7! C'était ça le problème.
Ernestas Stankevičius
Dans une application Web réelle, la deuxième requête fonctionne. Je viens d'ajouter une autre requête après la requête de connexion mysqli. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; Merci Chad!
GTodorov
1
Dans 5.7.20et pour le cas de mysql.ini, utiliser un trait de soulignement et oublier les citations fonctionne très bien, comme sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
suit
30

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"
JPro
la source
17
AVERTISSEMENT: D'après notre expérience, cela ne conserve pas le paramètre après un redémarrage de MySQL ...
Chadwick Meyer
1
Oui, cela ne conserve pas les paramètres après le redémarrage
prakashpoudel
4
Pour le conserver après le redémarrage pour unix, j'ai dû créer un fichier ~ / .my.cnf et ajouter [mysqld] sql_mode = "<nouveau mode>". J'espère que cela aidera
Raman Singh
27

Définition du mode sql de manière permanente en utilisant le fichier de configuration mysql.

Dans mon cas, je dois changer de fichier /etc/mysql/mysql.conf.d/mysqld.cnftel qu'il mysql.conf.dest inclus dans /etc/mysql/my.cnf. je change cela 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 de supprimer le ONLY_FULL_GROUP_BYmode SQL car il causait un problème.

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

Après ce changement, exécutez les commandes ci-dessous

sudo service mysql stop
sudo service mysql start

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

Yashrajsinh Jadeja
la source
14

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

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

MySQL redémarrer.

Ou vous pouvez aussi faire

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

MySQL redémarrer.

Devraj Gupta
la source
2
Je pense que c'est au sql_modelieu de sql-mode.
Raman Sahasi
13

Pour quelqu'un qui recherche cette erreur sur 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. À la place, utilisez CREATE USER. Suivre cette pratique rend le mode SQL NO_AUTO_CREATE_USER immatériel pour les instructions GRANT, il est donc également obsolète. MySQL 8.0.11: Utilisation de GRANT pour créer des utilisateurs. À la place, utilisez CREATE USER. Suivre cette pratique rend le mode SQL NO_AUTO_CREATE_USER sans importance pour les instructions GRANT, il est donc également supprimé.

Pris d' ici

Donc, vous sql_modepouvez être comme ça:

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}
Serhii Popov
la source
3

Pour un changement temporaire, utilisez la commande suivante

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

Pour un changement permanent: allez dans le fichier de configuration /etc/my.cnf ou /etc/mysql/mysql.conf.d/mysqld.cnf et ajoutez les lignes suivantes puis redémarrez le service mysql

[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"
Vineet Kumar
la source
2

Accédez à la base de données en tant qu'utilisateur administrateur (root peut-être).

Vérifier le SQL_mode actuel

mysql> SELECT @@sql_mode;

Pour définir un nouveau sql_mode, quittez la base de données, créez un fichier

nano /etc/mysql/conf.d/<filename>.cnf 

avec votre contenu sql_mode

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

Redémarrez Mysql

mysql> sudo service mysql stop
mysql> sudo service mysql start

Nous créons un fichier dans le dossier /etc/mysql/conf.d/ car dans le fichier de configuration principal /etc/mysql/my.cnf, la commande est écrite pour inclure tous les fichiers de paramètres du dossier / etc / mysql / conf. ré/

Eric Korolev
la source
1

Dans mon cas, je dois changer de fichier /etc/mysql/mysql.conf.d/mysqld.cnfchangez ceci sous [ mysqld]

Collez cette ligne sur la mysqldportion [ ]

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
shashikant parmar
la source
1

J'ai juste eu un problème similaire où MySQL (5.6.45) n'accepterait sql_modeaucun fichier de configuration.

La solution était d'ajouter init_file = /etc/mysql/mysql-init.sqlau fichier de configuration, puis de l'exécuter SET GLOBAL sql_mode = '';.

Cobra_Fast
la source
1

Consultez la documentation de sql_mode

Méthode 1:

Vérifiez la valeur par défaut de sql_mode:

SELECT @@sql_mode //check current value for sql_mode

SET GLOBAL sql_mode = "NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

Méthode 2:

Accédez à phpmyadmin pour modifier votre sql_mode

  • Connectez-vous sur phpmyadmin et ouvrez localhost
  • Haut sur les variables présentes en haut dans les éléments de menu et recherchez le mode SQL
  • Cliquez sur le bouton Modifier pour modifier sql_mode en fonction de vos besoins
  • Enregistrez les modifications

Paramètres du mode SQL dans phpmyadmin

Redémarrez le serveur après avoir exécuté les choses ci-dessus

Ankit Jindal
la source
1

Dans mon cas, mysql et ubuntu 18.04

Je l'ai défini en permanence à l'aide de cette commande

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Ajoutez la ligne après la configuration. Voir l'exemple mis en évidence dans l'image ci-dessous.

sql_mode = ""

Remarque: vous pouvez également ajouter différents modes ici, cela dépend de vos besoins NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Voir la documentation et la référence des modes SQL disponibles

ajout du mode SQL

Puis enregistrez. Après l'enregistrement, vous devez redémarrer votre service mysql, suivez la commande ci-dessous:

sudo service mysql restart

J'espère que cela t'aides :-)

Cristiana Chavez
la source
0

Si quelqu'un veut le définir uniquement pour la session en cours, utilisez la commande suivante

set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
ASHOK MANGHAT
la source
-3
set global sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Shadab Khan Zed
la source