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_BY
SQL 모드를 제거 하면 문제가 발생했습니다.
나는 사용 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}
답변
임시 변경의 경우 다음 명령을 사용하십시오.
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"
답변
관리자 사용자 (루트 일 수 있음)로 데이터베이스에 액세스합니다.
현재 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의를. 디/
