mysql에서 전역 sql_mode 설정


91

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 모드를 사용하는 것이 합리적입니다. 이게 말이 되요?

알려주세요.

감사.


그 잘못된 따옴표는 정말로 나를 괴롭힌다. 다른 사람들이 확신한다고 말했듯이 이것은 그 이유만으로 옳지 않습니다.
dyasta

답변:


205

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 모드 옵션을 .


2
감사합니다. my.cnf 설정이 나를 위해 트릭을 수행했습니다. 관심있는 분들을 위해이 페이지는 5.7 이상에서 기본 sql_modes가 무엇인지 알려줍니다. dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Richard

2
5.7 버전 참고! 그게 문제였습니다.
Ernestas Stankevičius

실제 웹 애플리케이션에서는 두 번째 쿼리가 작동합니다. mysqli 연결 쿼리 다음에 다른 쿼리를 추가했습니다. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; 감사합니다 Chad!
GTodorov

1
에서 5.7.20, 그리고 경우에 mysql.ini, 밑줄을 사용하고 따옴표를 망각하는 것은 너무 잘처럼 작동 :sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi 오콘

30

나는 그것을 해결했다.

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

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

17
경고 : 이것은 MySQL을 다시 시작한 후 설정을 유지하지 않는 우리의 경험에서 ...
채드윅 마이어

1
예, 재시작 후 설정이 유지되지 않습니다
prakashpoudel 2016 년

4
유닉스를 다시 시작한 후 유지하기 위해 ~ / .my.cnf 파일을 만들고 [mysqld] sql_mode = "<new mode>"를 추가해야했습니다. 이것이 도움이
Raman Singh

27

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하고 방금 설정 한 모드를 가져와야합니다.


14

구성 파일에 복사 : /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 재시작.


2
나는 생각 sql_mode대신 sql-mode.
Raman Sahasi

13

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}

3

임시 변경의 경우 다음 명령을 사용하십시오.

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

영구 변경 : 구성 파일 /etc/my.cnf 또는 /etc/mysql/mysql.conf.d/mysqld.cnf로 이동하여 다음 줄을 추가 한 다음 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

관리자 사용자 (루트 일 수 있음)로 데이터베이스에 액세스합니다.

현재 SQL_mode 확인

mysql> SELECT @@sql_mode;

새 sql_mode를 설정하려면 데이터베이스를 종료하고 파일을 만듭니다.

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

sql_mode 콘텐츠

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

Mysql 다시 시작

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

우리는 폴더에 파일 생성 /etc/mysql/conf.d/을 하기 때문에 주요 설정 파일에 /etc/mysql/my.cnf 명령이 폴더에서 모든 설정 파일을 포함하는 기록 을 / etc / mysql을 / conf의를. 디/


1

제 경우에는 /etc/mysql/mysql.conf.d/mysqld.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"

1

MySQL (5.6.45)이 sql_mode구성 파일에서 허용하지 않는 비슷한 문제가 발생했습니다 .

해결책은 init_file = /etc/mysql/mysql-init.sql구성 파일 에 추가 한 다음 SET GLOBAL sql_mode = '';거기에서 실행하는 것이 었 습니다.


1

sql_mode 의 문서를 확인하십시오.

방법 1 :

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";

방법 2 :

phpmyadmin에 액세스하여 sql_mode

  • phpmyadmin에 로그인하고 localhost를 엽니 다.
  • 메뉴 항목의 상단에있는 Top on VariablesSQL 모드 검색
  • 요구 사항에 따라 sql_mode를 수정하려면 편집 버튼을 클릭하십시오.
  • 변경 사항 저장

phpmyadmin의 SQL 모드 설정

위의 사항을 실행 한 후 서버를 다시 시작하십시오.


1

제 경우에는 mysql과 우분투 18.04

이 명령을 사용하여 영구적으로 설정했습니다.

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

구성 뒤에 줄을 추가하십시오. 아래 이미지에 강조 표시된 예를 참조하십시오.

sql_mode = ""

참고 : 여기에서 다른 모드를 추가 할 수도 있습니다. 필요에 따라 다릅니다. NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

사용 가능한 SQL 모드 참조설명서 참조

SQL 모드 추가

그런 다음 저장하십시오. 저장 한 후에는 mysql 서비스를 다시 시작해야합니다. 아래 명령을 따르십시오.

sudo service mysql restart

도움이 되었기를 바랍니다 :-)


0

누군가가 현재 세션에 대해서만 설정하려면 다음 명령을 사용하십시오.

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

-3
전역 sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"설정
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.