Od wersji 5.7 serwera MySQL parametr strict mode jest domyślnie ustawiony w jego konfiguracji po instalacji serwera. W konsekwencji tego, jeśli pola nie mają ustawionej domyślnej wartości, występuje błąd zapisu danych do bazy.
Mamy dwa wyjścia: możemy zaktualizować aplikację i ustawić dla wszystkich pól w bazie danych domyślne wartości, albo zmienić konfigurację serwera.
Wybierając drugie rozwiązanie edytujemy plik /etc/mysql/mysql.conf.d/mysqld.cnf
root@server:/# vim /etc/mysql/mysql.conf.d/mysqld.cnf
Odszukujemy sekcję [mysqld], która domyślnie powinna mieć ustawione poniższe wartości:
[mysqld] sql_mode = "STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
i usuwamy z parametrów wartość STRICT_TRANS_TABLES, jak poniżej:
[mysqld] sql_mode = "ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
W przypadku dalszych problemów z działaniem naszych aplikacji, problemem mogą być jeszcze 3 parametry: ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE.
Postępujemy jak poprzednio i usuwamy problematyczne parametry pracy serwera:
[mysqld] sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Jeśli z pliku /etc/mysql/my.cnf nie mamy sekcji [mysqld] lub w tej sekcji nie ma parametru sql_mode dopisujemy ją razem z odpowiednimi parametrami lub sam parametr.
Na zakończenie restartujemy serwer MySQL.
root@server:/# systemctl restart mysql
Po restarcie możemy sprawdzić czy zmienione zostały parametry pracy serwera. W poniższym poleceniu zamiast „user” i „password” wstawiamy oczywiście dane użytkownika, który ma prawa do logowania do serwera MySQL.
root@server:/# mysql -u user -ppassword -e "select @@sql_mode"
powinniśmy otrzymać podobny wynik:
+-----------------------------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------+ | ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-----------------------------------------------------------------------+