ustawienie globalnego sql_mode w mysql


91

Próbuję ustawić sql_mode w mysql, ale zgłasza błąd.

Komenda:

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

Czy to nie jest właściwy sposób ustawiania wielu trybów? Jakie są zalety ustawienia trybu sesji i trybu globalnego? który jest preferowany? Mam różnych użytkowników, którzy próbują zaktualizować bazę danych różnymi wartościami UNC i ustawiłem tryb sesji na 'NO_BACKSLASH_ESCAPES', pomyślałem, że sensowne byłoby ustawienie w tym celu trybu globalnego. Czy to ma sens?

Proszę daj mi znać.

Dzięki.


Te błędne cytaty naprawdę mnie niepokoją; s. Jak powiedzieli inni, jestem pewien, że to zdecydowanie nie jest w porządku tylko z tego powodu.
dyasta

Odpowiedzi:


205

BTW, jeśli ustawisz globalne w MySQL:

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

Nie spowoduje to trwałego ustawienia i będzie przywracany po każdym ponownym uruchomieniu.

Więc powinieneś ustawić to w swoim pliku konfiguracyjnym (np /etc/mysql/my.cnf W sekcji [mysqld]), aby zmiany pozostały w mocy po restarcie MySQL:

Plik konfiguracyjny: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

AKTUALIZACJA: Nowsze wersje MySQL (np. 5.7.8 lub nowszy) mogą wymagać nieco innej składni:

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

Upewnij się, że jest między nimi kreska sql-mode znakiem a nie podkreśleniem , a tryby są w cudzysłowie.

Zawsze odwołuj się do dokumentacji MySQL dla swojej wersji, aby zobaczyć opcje trybu sql .


2
Dziękuję, ustawienie w my.cnf załatwiło sprawę. Dla zainteresowanych ta strona informuje, jakie są domyślne tryby_sql w wersji 5.7 i nowszych: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Richard

2
Uwaga do wersji 5.7! To był problem.
Ernestas Stankevičius

W rzeczywistej aplikacji internetowej działa drugie zapytanie. Właśnie dodałem kolejne zapytanie po zapytaniu o połączenie mysqli. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; Dzięki Chad!
GTodorov

1
W 5.7.20, iw przypadku mysql.ini, używanie podkreślenia i zapominanie o cudzysłowach działa dobrze, na przykład:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

30

Rozwiązałem to.

właściwy tryb to:

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

17
OSTRZEŻENIE: Z naszego doświadczenia wynika, że ​​to nie zachowuje ustawienia po ponownym uruchomieniu MySQL ...
Chadwick Meyer

1
Tak, to nie zachowuje ustawień po ponownym uruchomieniu
prakashpoudel

4
Aby zachować go po restarcie dla unixa, musiałem utworzyć plik ~ / .my.cnf i dodać [mysqld] sql_mode = "<nowy tryb>". Mam nadzieję, że to pomoże
Raman Singh

27

Ustawienie trybu sql na stałe za pomocą pliku konfiguracyjnego mysql.

W moim przypadku muszę zmienić plik, /etc/mysql/mysql.conf.d/mysqld.cnfktóry mysql.conf.djest zawarty w /etc/mysql/my.cnf. zmieniam to pod [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"

właśnie usunąłem ONLY_FULL_GROUP_BYtryb sql, ponieważ powodował problem.

Używam ubuntu 16.04,php 7 a mysql version Daj mi tomysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Po tej zmianie uruchom poniższe polecenia

sudo service mysql stop
sudo service mysql start

Teraz sprawdź tryby sql za pomocą tego zapytania SELECT @@sql_modei powinieneś otrzymać tryby, które właśnie ustawiłeś.


14

Skopiuj do pliku konfiguracyjnego: /etc/mysql/my.cnf OR /bin/mysql/my.ini

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

MySQL uruchom ponownie.

Możesz też to zrobić

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

MySQL uruchom ponownie.


2
Myślę, że to sql_modezamiast sql-mode.
Raman Sahasi

13

Dla kogoś, kto szuka w Google tego błędu dla MySQL 8.

MySQL 8.0.11 usuwa 'NO_AUTO_CREATE_USER' z trybu sql.

MySQL 5.7: Używanie GRANT do tworzenia użytkowników. Zamiast tego użyj opcji CREATE USER. Postępowanie zgodnie z tą praktyką sprawia, że ​​tryb SQL NO_AUTO_CREATE_USER jest nieistotny dla instrukcji GRANT, więc również jest przestarzały. MySQL 8.0.11: Używanie GRANT do tworzenia użytkowników. Zamiast tego użyj opcji CREATE USER. Postępowanie zgodnie z tą praktyką sprawia, że ​​tryb SQL NO_AUTO_CREATE_USER nie ma znaczenia dla instrukcji GRANT, więc również jest usuwany.

Zaczerpnięte stąd

Tak, Twój sql_modemoże być tak:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Lub jeśli używasz Dockera , możesz dodać następne polecenie do 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}

3

Do zmiany tymczasowej użyj następującego polecenia

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

W celu trwałej zmiany: przejdź do pliku konfiguracyjnego /etc/my.cnf lub /etc/mysql/mysql.conf.d/mysqld.cnf i dodaj następujące wiersze, a następnie uruchom ponownie usługę 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"

2

Uzyskaj dostęp do bazy danych jako administrator (może root).

Sprawdź aktualny tryb SQL_mode

mysql> SELECT @@sql_mode;

Aby ustawić nowy tryb_sql, zamknij bazę danych i utwórz plik

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

z zawartością trybu sql_mode

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

Zrestartuj MySQL

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

Tworzymy plik w folderze /etc/mysql/conf.d/, ponieważ w głównym pliku konfiguracyjnym /etc/mysql/my.cnf jest napisane polecenie zawierające wszystkie pliki ustawień z folderu / etc / mysql / conf. re/


1

W moim przypadku muszę zmienić plik /etc/mysql/mysql.conf.d/mysqld.cnfzmień to pod [mysqld ]

Wklej tę linię w mysqldczęści [ ]

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

Właśnie miałem podobny problem, w którym MySQL (5.6.45) nie akceptował sql_modeżadnego pliku konfiguracyjnego.

Rozwiązaniem było dodanie init_file = /etc/mysql/mysql-init.sqldo pliku konfiguracyjnego, a następnie wykonanie SET GLOBAL sql_mode = '';w nim.


1

Sprawdź dokumentację sql_mode

Metoda 1:

Sprawdź domyślną wartość 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";

Metoda 2:

Uzyskaj dostęp do phpmyadmin, aby edytować plik sql_mode

  • Zaloguj się na phpmyadmin i otwórz localhost
  • Top on Zmienne obecne u góry w pozycjach menu i wyszukaj tryb sql
  • Kliknij przycisk edycji, aby zmodyfikować tryb sql_mode w oparciu o Twoje wymagania
  • Zapisz zmiany

ustawienia trybu sql w phpmyadmin

Zrestartuj serwer po wykonaniu powyższych czynności


1

W moim przypadku mysql i ubuntu 18.04

Ustawiłem go na stałe za pomocą tego polecenia

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

Dołącz wiersz po konfiguracji. Zobacz przykład zaznaczony na poniższym obrazku.

sql_mode = ""

Uwaga: tutaj możesz również dodać różne tryby, zależy to od Twoich potrzeb NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Zobacz informacje o dostępnych trybach sql i dokumentacja

dodanie trybu sql

Następnie zapisz. Po zapisaniu musisz ponownie uruchomić usługę mysql, wykonaj poniższe polecenie:

sudo service mysql restart

Mam nadzieję że to pomoże :-)


0

Jeśli ktoś chce ustawić go tylko dla bieżącej sesji, użyj następującego polecenia

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

-3
ustaw globalny sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.