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.


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 .


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"

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.


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.


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}

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"

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é/


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"

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 = '';.


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


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 :-)


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

-3
set global sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.