impostazione di sql_mode globale in mysql


94

Sto cercando di impostare sql_mode in mysql ma genera un errore.

Comando:

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

Non è questo il modo corretto per impostare più modalità? Quali sono i vantaggi dell'impostazione delle modalità sessione e globale? quale è preferito? Ho diversi utenti che cercano di aggiornare il database con diversi valori UNC e invece di impostare la modalità di sessione su "NO_BACKSLASH_ESCAPES", ho pensato che avesse senso impostare una modalità gloabl per questo. Ha senso ciò?

Per favore mi faccia sapere.

Grazie.


Quelle citazioni errate mi infastidiscono davvero; p. Come altri hanno detto, ne sono sicuro, questo non è assolutamente giusto solo per questo.
dyasta

Risposte:


211

A proposito, se imposti i valori globali in MySQL:

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

Questo non lo imposterà PERMANENTEMENTE e verrà ripristinato dopo ogni riavvio.

Quindi dovresti impostarlo nel tuo file di configurazione (ad esempio /etc/mysql/my.cnfnella sezione [mysqld]), in modo che le modifiche rimangano effettive dopo il riavvio di MySQL:

File di configurazione: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

AGGIORNAMENTO: le versioni più recenti di Mysql (es. 5.7.8 o successive) potrebbero richiedere una sintassi leggermente diversa:

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

Assicurati che ci sia un trattino tra sql-modenon un trattino basso e che le modalità siano tra virgolette.

Fai sempre riferimento a MySQL Docs per la tua versione per vedere le opzioni della modalità sql .


2
Grazie, l'impostazione in my.cnf ha funzionato per me. Per chi fosse interessato, questa pagina ti dice quali sono i sql_modes predefiniti in 5.7 e versioni successive: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Richard

2
Note sulla versione 5.7! Quello era il problema.
Ernestas Stankevičius

In una vera applicazione web la seconda query funziona. Ho appena aggiunto un'altra query dopo la query di connessione mysqli. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; Grazie Chad!
GTodorov

1
In 5.7.20, e nel caso di mysql.ini, usare un trattino basso e dimenticare le virgolette funziona bene, in questo modo:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

32

L'ho risolto.

la modalità corretta è:

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

17
ATTENZIONE: Nella nostra esperienza questo non mantiene l'impostazione dopo un riavvio di MySQL ...
Chadwick Meyer,

1
Sì, questo non mantiene le impostazioni dopo il riavvio
prakashpoudel

4
Per mantenerlo dopo il riavvio per unix, ho dovuto creare un file ~ / .my.cnf e aggiungere [mysqld] sql_mode = "<nuova modalità>". Spero che questo aiuti
Raman Singh

28

Impostazione permanente della modalità sql utilizzando il file di configurazione mysql.

Nel mio caso devo modificare il file /etc/mysql/mysql.conf.d/mysqld.cnfpoiché mysql.conf.dè incluso in/etc/mysql/my.cnf . lo cambio in [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"

appena rimosso la ONLY_FULL_GROUP_BYmodalità sql perché causava problemi.

sto usando ubuntu 16.04 , php 7e mysql --version give me questomysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Dopo questa modifica, esegui i comandi seguenti

sudo service mysql stop
sudo service mysql start

Ora controlla le modalità sql con questa query SELECT @@sql_modee dovresti ottenere le modalità che hai appena impostato.


15

Copia nel file di configurazione: /etc/mysql/my.cnf OR /bin/mysql/my.ini

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

MySQL ricomincia.

Oppure puoi anche farlo

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

MySQL ricomincia.


2
Penso che sia sql_modeinvece di sql-mode.
Raman Sahasi

14

Per qualcuno che cerca su Google questo errore per MySQL 8.

MySQL 8.0.11 rimuove 'NO_AUTO_CREATE_USER' dalla modalità sql.

MySQL 5.7: utilizzo di GRANT per creare utenti. Utilizza invece CREATE USER. Seguendo questa pratica, la modalità SQL NO_AUTO_CREATE_USER diventa irrilevante per le istruzioni GRANT, quindi anch'essa è deprecata. MySQL 8.0.11: utilizzo di GRANT per creare utenti. Utilizza invece CREATE USER. Seguire questa pratica rende la modalità SQL NO_AUTO_CREATE_USER irrilevante per le istruzioni GRANT, quindi anch'essa viene rimossa.

Preso da qui

Quindi, sql_modepuoi essere così:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Oppure, se stai usando Docker, puoi aggiungere il comando successivo a 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}

4

Per la modifica temporanea utilizzare il seguente comando

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

Per modifiche permanenti: vai al file di configurazione /etc/my.cnf o /etc/mysql/mysql.conf.d/mysqld.cnf e aggiungi le seguenti righe, quindi riavvia il servizio 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"

3

Accedi al database come utente amministratore (root forse).

Verifica SQL_mode corrente

mysql> SELECT @@sql_mode;

Per impostare un nuovo sql_mode, esci dal database, crea un file

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

con il tuo contenuto sql_mode

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

Riavvia Mysql

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

Creiamo un file nella cartella /etc/mysql/conf.d/ perché nel file di configurazione principale /etc/mysql/my.cnf viene scritto il comando per includere tutti i file di impostazioni dalla cartella / etc / mysql / conf. d /


2

Controlla la documentazione di sql_mode

Metodo 1:

Controlla il valore predefinito di 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";

Metodo 2:

Accedi a phpmyadmin per modificare il tuo file sql_mode

  • Accedi a phpmyadmin e apri localhost
  • In alto sulle variabili presenti in alto nelle voci di menu e cerca la modalità sql
  • Fare clic sul pulsante Modifica per modificare sql_mode in base alle proprie esigenze
  • Salva le modifiche

impostazioni della modalità sql in phpmyadmin

Riavvia il server dopo aver eseguito le cose sopra


1

Nel mio caso devo modificare il file, /etc/mysql/mysql.conf.d/mysqld.cnfmodificalo in [ mysqld]

Incolla questa riga sulla parte [ 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"

1

Ho appena avuto un problema simile in cui MySQL (5.6.45) non accettava sql_mode da nessun file di configurazione.

La soluzione era aggiungere init_file = /etc/mysql/mysql-init.sqlal file di configurazione e quindi eseguire SET GLOBAL sql_mode = '';lì.


1

Nel mio caso mysql e ubuntu 18.04

L'ho impostato in modo permanente utilizzando questo comando

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

Aggiungi la riga dopo la configurazione. Vedi esempio evidenziato nell'immagine sotto.

sql_mode = ""

Nota: puoi anche aggiungere diverse modalità qui, dipende dalle tue necessità NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Vedere Documentazione e riferimento sulle modalità sql disponibili

aggiunta della modalità sql

Quindi salva. Dopo aver salvato è necessario riavviare il servizio mysql, seguire il comando seguente:

sudo service mysql restart

Spero che sia di aiuto :-)


0

Se qualcuno desidera impostarlo solo per la sessione corrente, utilizzare il seguente comando

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

-3
imposta sql_mode globale = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.