Programing

mysql에서 전역 sql_mode 설정

lottogame 2020. 11. 3. 07:34
반응형

mysql에서 전역 sql_mode 설정


mysql에서 sql_mode를 설정하려고하는데 오류가 발생합니다.

명령:

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

여러 모드를 설정하는 적절한 방법이 아닙니까? 세션 및 글로벌 모드 설정의 장점은 무엇입니까? 어느 것이 선호됩니까? 다른 사용자가 다른 UNC 값으로 데이터베이스를 업데이트하려고 시도하고 세션 모드를 'NO_BACKSLASH_ESCAPES'로 설정하는 것이 좋지만,이를 위해 gloabl 모드를 사용하는 것이 합리적입니다. 이게 말이 되요?

알려주세요.

감사.


BTW, MySQL에서 전역을 설정하는 경우 :

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

영구적으로 설정되지 않으며 다시 시작할 때마다 되돌아갑니다.

따라서 구성 파일 (예 : /etc/mysql/my.cnf[mysqld] 섹션)에서이를 설정해야 MySQL을 다시 시작한 후에도 변경 사항이 적용됩니다.

구성 파일 : /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

업데이트 : 최신 버전의 Mysql (예 : 5.7.8 이상)에는 약간 다른 구문이 필요할 수 있습니다.

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

sql-mode밑줄 아닌 사이에 대시가 있고 모드가 큰 따옴표로 묶여 있는지 확인하십시오 .

항상 참조 MySQL의 문서를 위한 당신의 볼 버전의 SQL 모드 옵션을 .


나는 그것을 해결했다.

올바른 모드는 다음과 같습니다.

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

mysql 구성 파일을 사용하여 영구적으로 SQL 모드 설정.

내 경우에는 내가 파일을 변경해야 /etc/mysql/mysql.conf.d/mysqld.cnf으로 mysql.conf.d포함되어 있습니다 /etc/mysql/my.cnf. 나는 이것을 [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"

방금 ONLY_FULL_GROUP_BYSQL 모드를 제거 하면 문제가 발생했습니다.

나는 사용 ubuntu 16.04하고 php 7있으며 mysql --version은 나에게 이것을 준다.mysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

이 변경 후 명령 아래 실행

sudo service mysql stop
sudo service mysql start

이제이 쿼리로 SQL 모드를 확인 SELECT @@sql_mode하고 방금 설정 한 모드를 가져와야합니다.


구성 파일에 복사 : /etc/mysql/my.cnf OR /bin/mysql/my.ini

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

MySQL 재시작.

또는 할 수 있습니다

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

MySQL 재시작.


MySQL 8에서이 오류를 검색하는 사람을 위해.

MySQL 8.0.11은 sql-mode에서 'NO_AUTO_CREATE_USER'를 제거합니다.

MySQL 5.7 : GRANT를 사용하여 사용자 생성. 대신 CREATE USER를 사용하십시오. 이 방법을 따르면 NO_AUTO_CREATE_USER SQL 모드는 GRANT 문에 중요하지 않으므로 더 이상 사용되지 않습니다. MySQL 8.0.11 : GRANT를 사용하여 사용자 생성. 대신 CREATE USER를 사용하십시오. 이 방법을 따르면 NO_AUTO_CREATE_USER SQL 모드는 GRANT 문에 중요하지 않으므로 제거됩니다.

여기 에서 찍은

따라서 sql_mode다음과 같이 될 수 있습니다.

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

또는 Docker를 사용하는 경우 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}

In my case i have to change file /etc/mysql/mysql.conf.d/mysqld.cnf change this under [mysqld]

Paste this line on [mysqld] portion

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

If someone want to set it only for the current session then use the following command

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

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

참고URL : https://stackoverflow.com/questions/2317650/setting-global-sql-mode-in-mysql

반응형