MySQL ha modificato il valore predefinito della variabile sql_mode dalle versioni precedenti che sta rompendo il codice esistente in diverse applicazioni. Questo tutorial spiega come modificare sql_mode in base alle funzionalità dell'applicazione. Fornisce inoltre i passaggi per preservare questo valore al riavvio del server.
Note :Puoi anche seguire i tutorial di MySQL - Come installare MySQL 8 su Ubuntu, Come rimuovere completamente MySQL da Ubuntu e Impara le query SQL di base usando MySQL.
Il valore predefinito della variabile sql_mode in MySQL 8 è come mostrato di seguito.
# Default - sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Nel mio caso l'opzione ONLY_FULL_GROUP_BY sta violando il codice, quindi lo rimuoverò a scopo dimostrativo
Aggiorna direttamente
Possiamo aggiornare direttamente il valore di sql_mode utilizzando i comandi come mostrato di seguito.
# Login
mysql -u root -p
# Globally
SET GLOBAL sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
# Session
SET SESSION sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
Il valore sql_mode verrà modificato utilizzando le query sopra menzionate. Il problema è che la variabile ripristina il valore predefinito al riavvio del server. Possiamo preservare il valore come mostrato nella sezione successiva.
Aggiorna permanentemente
Possiamo preservare il valore di sql_mode aggiornando my.cnf file. La posizione di questo file varia in base all'ambiente e alla versione del server. Le posizioni più comuni di questo file includono/etc/my.
Su Linux Mint 18 , il percorso del file è /
# Search the default config
mysqld --verbose --help | grep -A 1 "Default options"
# Output
Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
Il server MySQL esaminerà le posizioni sopra menzionate per le configurazioni predefinite sia a livello di sistema che a livello locale. Aggiorna il file my.cnf come mostrato di seguito. Ho usato l'editor nano per la dimostrazione
# Update my.cnf
sudo nano /etc/mysql/my.cnf
# Scroll down and update the file as shown below
...
...
# # The MySQL Server configuration file. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html # * IMPORTANT: Additional settings that can override those from this file! # The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ [mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
Ora salva il file ed esci dall'editor. Assicurati di includere [mysqld] sopra la variabile.
Riavvia il server MySQL per impostare il valore della variabile sql_mode come da noi configurato nel file my.cnf come mostrato sopra.
# Using init
sudo /etc/init.d/mysqld restart
# OR
sudo /etc/init.d/mysql restart
# Using service
sudo service mysql restart
# Using systemd
sudo systemctl restart mysqld.service
# OR
sudo systemctl restart mysql
Riepilogo
In questo tutorial, abbiamo aggiornato il valore della variabile MySQL sql_mode e anche conservato permanentemente al riavvio del server.