MySQL zmienił domyślną wartość zmiennej sql_mode od poprzednich wydań, które łamią istniejący kod w kilku aplikacjach. Ten samouczek wyjaśnia, jak zmienić tryb sql_mode zgodnie z funkcjami aplikacji. Zawiera również instrukcje zachowania tej wartości po ponownym uruchomieniu serwera.
Notatki :Możesz również skorzystać z samouczków MySQL - Jak zainstalować MySQL 8 na Ubuntu, Jak całkowicie usunąć MySQL z Ubuntu i Naucz się podstawowych zapytań SQL przy użyciu MySQL.
Domyślna wartość zmiennej sql_mode w MySQL 8 jest pokazana poniżej.
# 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
W moim przypadku opcja ONLY_FULL_GROUP_BY łamie kod, dlatego usunę go do demonstracji
Aktualizuj bezpośrednio
Możemy bezpośrednio zaktualizować wartość sql_mode używając poleceń, jak pokazano poniżej.
# 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";
Wartość sql_mode zostanie zmieniona za pomocą powyższych zapytań. Problem polega na tym, że zmienna odzyskuje swoją domyślną wartość po restarcie serwera. Możemy zachować wartość, jak pokazano w następnej sekcji.
Aktualizuj na stałe
Możemy zachować wartość sql_mode, aktualizując my.cnf plik. Lokalizacja tego pliku różni się w zależności od środowiska i wersji serwera. Najczęstsze lokalizacje tego pliku to/etc/my.
Na Linux Mint 18 , lokalizacja pliku to /
# 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
Serwer MySQL przyjrzy się wyżej wymienionym lokalizacjom pod kątem domyślnych konfiguracji zarówno na poziomie systemu, jak i na poziomie lokalnym. Zaktualizuj plik my.cnf, jak pokazano poniżej. Użyłem edytora nano do demonstracji
# 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"
Teraz zapisz plik i wyjdź z edytora. Pamiętaj, aby dołączyć [mysqld] nad zmienną.
Zrestartuj serwer MySQL, aby ustawić wartość zmiennej sql_mode skonfigurowaną przez nas w pliku my.cnf, jak pokazano powyżej.
# 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
Podsumowanie
W tym samouczku zaktualizowaliśmy wartość zmiennej MySQL sql_mode a także zachował go na stałe przy restarcie serwera.