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.