ONLY_FULL_GROUP_BY 사용 안함


614

실수로 다음과 같이 ONLY_FULL_GROUP_BY 모드를 활성화했습니다.

SET sql_mode = 'ONLY_FULL_GROUP_BY';

비활성화하려면 어떻게합니까?


38
당신은 시도 했습니까 SET sql_mode = ''?
Tripp Kinetics

4
MySQL이 SQL 표준을 더 잘 준수하도록하는 모드와 쿼리 작성에보다주의를 기울이는 모드를 비활성화하려는 이유는 무엇입니까?
Andriy M

34
Mysql 5.7부터는 ANY_VALUE ( column) 함수를 사용하여 쿼리를 개조 할 수도 있습니다. 문서를 참조하십시오 여기
Qoheleth 테크

3
@AndriyM 나는 오래된 응용 프로그램의 전체로드를 새로운 서버로 포팅하고 소스가 있는지 여부에 관계없이 작동해야하기 때문에 곧 이것을 사용해야합니다.
Jaydee

8
@AndriyM 고유 인덱스 열로 그룹화하면 모든 행이 고유하다는 것을 이미 알고 있으므로 모든 명령에 대해 별도의 그룹을 추가합니다. 단일. 기둥. 테이블에는 왕의 고통이 있습니다.
Benubird

답변:


1163

해결 방법 1 : MySQL 콘솔에서 ONLY_FULL_GROUP_BY 제거

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

여기서 더 읽을 수 있습니다

해결 방법 2 : phpmyadmin에서 ONLY_FULL_GROUP_BY 제거

  • phpmyadmin을 열고 localhost를 선택하십시오
  • 메뉴 변수를 클릭하고 SQL 모드에서 아래로 스크롤하십시오.
  • 값을 변경하고 ONLY_FULL_GROUP_BY를 제거 하고 저장을 클릭 하려면 편집 버튼을 클릭하십시오. 여기에 이미지 설명을 입력하십시오

12
이 솔루션은 mySQL 5.7.11에서 잘 작동하며 허용되는 솔루션이어야합니다. 허용 된 답변이 mySQL의 새 버전에서는 작동하지 않습니다
Anyone_ph

4
그냥 보장했다. 중요한 것은 REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')MySQL이 레코드에서 원치 않는 쉼표를 제거한다는 것입니다. OP의 답변이 맞습니다.
nawfal

40
이것은 작동하지만 mysql 서버를 다시 시작하면 기본값이 복원됩니다 ... 왜? 지속적인 솔루션이 있습니까? 감사!
Vincent Pazeller

52
내 질문에 대한 대답 (영구적 솔루션) : sql_mode 설명을 my.cnf 파일 (예 : /etc/my.cnf) 안에 넣고 서버를 다시 시작해야합니다. 예를 들어 ([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"
Vincent

21
GLOBAL나를 위해 일 SESSION하지 않았다. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre

371

최신 정보:

여기에 이미지 설명을 입력하십시오

현재 mysql 설정을 유지하고 비활성화하려면 ONLY_FULL_GROUP_BYphpmyadmin 또는 사용중인 클라이언트를 방문하여 다음을 입력하십시오.

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me

다음 결과를 my.ini파일로 복사 하십시오.

민트 :sudo nano /etc/mysql/my.cnf

우분투 16 이상 :sudo nano /etc/mysql/my.cnf

우분투 14-16 :/etc/mysql/mysql.conf.d/mysqld.cnf

주의! copy_me결과는 기본적으로 잘릴 수있는 긴 텍스트를 포함 할 수 있습니다. 전체 텍스트를 복사하십시오!


오래된 답변 :

영구적으로 오류 를 사용하지 않으려면 " SELECT 목록의 표현식 #N이 GROUP BY 절에없고 GROUP BY 절의 열에 기능적으로 종속되지 않는 집계되지 않은 열 'db.table.COL'을 포함합니다. 이는 sql_mode = only_full_group_by와 호환되지 않습니다. "다음 단계를 수행하십시오.

  1. sudo nano /etc/mysql/my.cnf
  2. 이것을 파일 끝에 추가하십시오

    [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"
  3. sudo service mysql restart MySQL을 다시 시작하려면

모든 사용자에 ONLY_FULL_GROUP_BY대해 비활성화 됩니다


2
나를 위해, mysqld 태그를 같은 줄에 설정하는 것은 효과가 없었지만 줄 바꿈으로 작동했습니다 :) thanks
bloub

23
우분투의 경우, 사용자 정의 구성 값이있는 파일은/etc/mysql/mysql.conf.d/mysqld.cnf
knb

5
이것은 Ubuntu 16.04 (14 ~ 16 업그레이드 문제)에서 작동했습니다. /etc/mysql/my.cnf가 올바른 파일입니다. knb가 언급 한 파일은 최소한 16.04에이 my.cnf 파일에 포함되어 있습니다 (이제 구성이 여러 파일로 분할 됨).
jwinn

2
"SELECT @@ sql_mode;"를 사용하십시오. 변경하기 전에 현재 어떤 모드가 켜져 있는지 확인하십시오.
Zbigniew Ledwoń

1
실제로 볼 [mysqld]수 있는 곳 은이 파일에 없을 수도 있고 include 디렉토리에있을 수도 있습니다. 이 명령을 먼저 사용하십시오. 현재 상태 grep -R "\[mysqld\]" *를 확인하고 문제를 해결해보십시오grep -R "\bsql_mode\b" *
Oliver Williams

203

조심해서 사용하십시오

SET sql_mode = '' 

실제로 활성화 된 모든 모드가 지워집니다. 다른 설정을 엉망으로 만들지 않으려면

SELECT @@sql_mode 

먼저 쉼표로 구분 된 모드 목록을 활성화하려면 ONLY_FULL_GROUP_BY옵션 없이이 목록으로 설정하십시오 .


가장 좋은 방법은 무엇입니까 then SET it to this list without the ONLY_FULL_GROUP_BY option.?
케빈 메러디스

4
@KevinMeredith 내 문서를 읽는 것은 한 번에 하나의 모드를 켜거나 끌 수있는 방법이 없다는 것입니다. 모든 예를 들어 원하는 쉼표로 구분 된 목록을 제공해야합니다 (예SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
William Turrell

1
이것이 영구적으로 변경되면 다음과 같은 줄로 my.cnf를 편집 sql_mode=<comma-separated-list>한 다음 서버를 중지하고 시작하십시오. my.cnf의 위치 및 최상의 편집 방법은 운영 체제 설명서를 참조하십시오.
블랙 우드

107

이것을 시도하십시오 :

SET sql_mode = ''

커뮤니티 참고 : 아래 답변에서 지적했듯이 실제로 현재 활성화 된 모든 SQL 모드 가 지워 집니다. 그것은 반드시 당신이 원하는 것이 아닐 수도 있습니다.


11
와, ''= 'full group by is disabled'? MySQL은 꽤 바보 같은 일을하지만 그 위에 있습니다.
Aaron Bertrand

38
필자는 이것이 기본적으로 모든 SQL 모드를 비활성화한다고 생각합니다.
ZviBar

이것은 나를 위해 작동하지 않았습니다. 내가보고 0 rows affected내 쿼리는 여전히 작동하지 않습니다Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
최대 Heiber

10
이 답변을 시도하기 전에 Machavity의 경고 를 확인하고 변경 사항을 유지 하려면 명령사용global 하십시오 .
thomas88wp

6
얼마 후 MySql으로 돌아올 때마다 항상 문제가 무엇인지 잊어 버렸기 때문에 항상이 문제를 만납니다.) 느낌이 실망 스럽습니다. 버전 변경으로 인해
X-HuMan

106
    mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> exit;

@ RémiBreton : UR mysql 버전은 무엇입니까?
WeiYuan

6
이것은 실제로 작동합니다. 그러나 시스템을 다시 시작한 후 (우분투 16.04) sql_mode이전 값으로 롤백합니다. 내가 지금 무엇을 할 수 있을까?
pktangyue

굉장하고 나를 위해 일했습니다. 단지 이것을 영구적으로 변환해야합니다.
Fernando Torres

74

기존 모드를 제거하지 않고 sql_mode에 하나의 모드 만 추가 :

SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

다른 모드를 제거하지 않고 sql_mode에서 특정 모드 만 제거 :

SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));

귀하의 경우에만 ONLY_FULL_GROUP_BY모드 를 제거 하려면 아래 명령을 사용하십시오.

SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

참조 : http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html


이것은 좋은 답변입니다! 감사.
wedi

1
이것이 전역 또는 현재 연결에 있습니까? 좋은 답변입니다!
Oliver M Grech

48

@cwhisperer에게 감사합니다. Symfony 앱에서 Doctrine과 동일한 문제가있었습니다. 방금 config.yml에 옵션을 추가했습니다.

doctrine:
    dbal:
        driver:   pdo_mysql
        options:
            # PDO::MYSQL_ATTR_INIT_COMMAND
            1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

이것은 나를 위해 잘 작동했습니다.


1
그리고 SET NAMES 'utf8'과 결합해야하는 경우 "SET NAMES 'utf8', sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', '');"); "다음에 사용하십시오. "SET NAMES 'utf8'; SET sql_mod ..."와 같이 두 개의 쿼리를 대신 사용하면 "일반 오류 : 2014 버퍼되지 않은 다른 쿼리가 활성화되어있는 동안에는 쿼리를 실행할 수 없습니다."가 발생합니다.
Ventzy Kunev

@VentzyKunev이 조언을 따르지 말고이 SET NAMES방법을 사용하여 설정하지 마십시오 . 대부분의 경우 이미 doctrine.dbal.charset cofnig를 통해 symfony가 설정되어 있지 않습니다 : symfony.com/doc/current/reference/configuration/doctrine.html PDO dns를 통해 올바르게 수행하는 SET NAMES는 구식 방식으로, 5.3보다 큰 PHP 버전에는 사용해서는 안됩니다
LPodolski

39

의 위에:

  • 우분투 14.04
  • EditLine 래퍼를 사용하는 Linux (x86_64) 용 mysql Ver 14.14 Distrib 5.7.16

하다:

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

복사 및 붙여 넣기:

[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

파일의 맨 아래

$ sudo service mysql restart

mysql.cnf를 mysql 업데이트로 덮어 쓰지 않습니까?
cwhisperer

1
@cwhisperer /etc/mysql/mysql.cnf는 2 개의 구성 폴더 !includedir /etc/mysql/conf.d/+를 가리 킵니다 !includedir /etc/mysql/mysql.conf.d/. 동일합니다 /etc/mysql/my.cnf. 따라서 업데이트시 구성 파일이 재정의되지 않는다고 가정합니다. 자세한 내용은 여기를 참조하십시오http://dev.mysql.com/doc/mysql/en/server-system-variables.html
Jadeye

나는 이것을 시도했지만 우분투 18.04.2 바이오닉에서는 작동하지 않았다. 나는 이것을 따랐고 그것을 작동 시켰다 : sitepoint.com/…- 아마도 공백과 따옴표와 함께이 형식을 사용 sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"하는 것이 중요하다 : 아마도 새로운 파일을 /etc/mysql/mysql.conf.d/mysqld_mode.cnf대신 만드는 것이 중요하다
rubo77

이것은 mysql 서버 재시작 이후에도 작동합니다
Akshay Khale

36

MySQL 서버가 다시 시작되지 않으면 @Eyo Okon Eyo 솔루션이 작동하고 기본 설정이 복원되는 것을 알았습니다. 나를 위해 일한 영구적 인 해결책은 다음과 같습니다.

특정 SQL 모드 (이 경우 ONLY_FULL_GROUP_BY ) 를 제거하려면 현재 SQL 모드를 찾으십시오.

SELECT @@GLOBAL.sql_mode;

결과를 복사하고 필요없는 것을 제거하십시오 ( ONLY_FULL_GROUP_BY )

예 :

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

이 파일을 작성하고여십시오 :

/etc/mysql/conf.d/disable_strict_mode.cnf

새 SQL 모드를 작성하고 붙여 넣으십시오.

[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

MySQL을 다시 시작하십시오.

sudo service mysql restart

또는 ANY_VALUE()ONLY_FULL_GROUP_BY 값 거부를 억제 하는 데 사용할 수 있습니다. 여기에 대한 자세한 내용은 여기를 참조하십시오.


3
업에 대한ANY_VALUE()
Sithu

25

MySQL의 문서는 또한 다음과 같은 방법을 지정합니다 :

  • sql-mode="<modes>"my.cnf (Unix 운영 체제) 또는 my.ini (Windows)와 같은 옵션 파일에서 설정하십시오 .
  • 명령 행을 통해 서버 시작시 SQL 모드를 설정하려면 --sql-mode="<modes>"옵션을 사용하십시오 .

* <modes>쉼표로 구분 된 다른 모드 목록이 있습니다.

SQL 모드를 명시 적으로 지우려면 --sql-mode=""명령 행 또는 sql-mode=""옵션 파일을 사용하여 빈 문자열로 설정 하십시오.

sql-mode=""옵션을 추가하고 /etc/my.cnf작동했습니다.

이 SO 솔루션 에서는 MySQL에서 사용중인 my.cnf 파일을 찾는 방법에 대해 설명합니다.

변경 후 MySQL을 다시 시작하는 것을 잊지 마십시오.


1
이것은 나를위한 정답입니다.`Ver 14.14 Distrib 5.7.10, osx10.11 (x86_64)`
Sinux

정답으로 표시해야합니다. 다른 답변은 영구적 인 해결책을 제공하지 않습니다.
sijpkes

@ br3nt 현재 사용중인 모드를 어떻게 감지하여 모든 모드를 설정 해제하지 않으려는 경우 원하지 않는 모드를 제거 할 수 있습니까?
simgineer

1
시도SELECT @@GLOBAL.sql_mode;
br3nt

19

WAMP를 사용하는 경우 WAMP 아이콘을 마우스 왼쪽 버튼으로 클릭하고 MySQL-> MySQL 설정-> sql-mode로 이동 한 다음 sql-mode-> user mode를 선택하십시오.

이 이미지를 확인


WAMP 설치에 MySQL 설정이없는 이유가 있습니까? 서비스 관리 및 MySQL 콘솔이 있지만 설정이 없습니까?
Craig

이것이 바로 내가 찾던 것입니다! 간단한 WAMP Server 솔루션을 제공해 주셔서 감사합니다! 이 자습서에서 #aggregation을 수행하는 동안이 작업이 필요했습니다. youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle-CodeSlayer2010

12

내 SQL (Mac OS X에서 실행되는 버전 5.7.11)에서는 mysql 쉘 클라이언트에서 작동합니다.

SET
@@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

MySQL 5.6 Documentation에 따르면 sql_mode는 기본값입니다.

MySQL 5.6.5의 빈 문자열 및 5.6.6의 NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES +

MySQL 5.6 참조


다른 답변 sql_mode := ''은 가능하다고 주장 합니다. 왜 동의하지 않습니까?
Hermann Döppes

문자열의 모든 옵션은 어디에서 왔습니까? 이 뒤에 추론은 무엇입니까?
Hermann Döppes

MySQL의 5.6 문서에 따르면, sql_mode은 기본 5.6.6 빈 MySQL은 5.6.5에서 문자열과 후면 NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES입니다 dev.mysql.com/doc/refman/5.6/en/...을
살바토레 나폴리

EditLine 래퍼를 사용하여 Linux (x86_64) 용 Ubuntu 16.04-mysql Ver 14.14 Distrib 5.7.18에서 감사했습니다.
Paul Preibisch

12

MySQL 5.7 및 Ubuntu 16.04에서 mysql.cnf 파일을 편집하십시오.

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

다음과 같이 sql_mode를 포함시키고 파일을 저장하십시오.

[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

필자의 경우 STRICT_TRANS_TABLES 모드와 ONLY_FULL_GROUP_BY 모드를 제거했습니다.

이렇게하면 모드 구성이 영구적으로 저장됩니다. MySQL을 통해 @@ sql_mode를 업데이트하는 경우와는 달리 머신 / 서비스를 다시 시작할 때 재설정되기 때문입니다.

그런 다음 수정 된 구성을 수행하여 mysql 서비스를 다시 시작하십시오.

$ sudo service mysql restart

mysql에 액세스하십시오 :

$ mysql -u user_name -p

MySQL 콘솔에 로그인하여 액세스 할 수 있으면 문제가 없습니다. 큰!

그러나 나와 같은 경우 sql_modemysqld 의 옵션 임을 나타내는 "알 수없는 변수 sql_mode" 오류가 발생 하면 다시 돌아가서 mysql.cnf 파일을 다시 편집하고를 변경해야 합니다 . MySQL 서비스를 다시 시작하고 MySQL 콘솔에서 로그인을 시도하는 마지막 테스트를 수행하십시오. 여기있어![mysql][mysqld]


1
@ alexandre-ribeiro 덕분에 세션에서 설정하는 것보다 위에서 언급 한 접근 방식을 강력히 권장합니다. Ubuntu 16.04 및 mysql 5.7.x를 사용하는 사람들은 내 경험에 따라 [mysql] 에 대해 선언하는 것이 작동하지 않으므로 파일을 더 잘 편집하고 [mysqld] 그룹 아래에 ini 지시문 sql_mode = <modes>를 입력하십시오 .
codarrior

MySQL 5.7.22가 있습니다. 이상하지만 , 위와 같이 my.cnf의 sql_mode 선언에서 STRICT_TRANS_TABLES와 ONLY_FULL_GROUP_BY를 모두 제거 해야했습니다. 실제로 ONLY_FULL_GROUP_BY 모드 만 제거하고 싶습니다. "global / session sql_mode = ..."를 설정하면 STRICT_TRANS_TABLES를 제거하지 않고도 ONLY_FULL_GROUP_BY 만 제거 할 수 있습니다. 그러나 이것이 다시 시작해도 살아남지 않기 때문에 나에게는별로 유용하지 않습니다.
RayCh

12

이것이 Mysql Workbench에서 수정하기 위해 수행 한 것입니다.

아래 명령으로 현재 값을 얻기 전에

SELECT @@sql_mode 

나중에 목록에서 ONLY_FULL_GROUP_BY 키를 제거하고 아래 명령을 붙여 넣었습니다.

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

10

Mac OS Mojave (10.14)의 경우 열린 터미널

$ sudo mkdir /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ cd /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ sudo nano my.cnf

붙여 넣기 :

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

저장 및 종료 나노에 Shortkeys : Ctrl+xyEnter

참고 :mysql-5.7.24-macos10.14-x86_64 이 명령으로 업데이트해야 할 수도 있습니다. 정확한 폴더 이름을 확인하십시오./usr/local/

그것이 누군가를 도울 수 있기를 바랍니다!


10

에 모드 추가 또는 제거 sql_mode

MySQL 5.7.9 이상

에서 모드를 추가하거나 제거하려면 및 기능을 sql_mode사용할 수 있습니다 .list_addlist_drop

전류에서 모드를 제거하려면 SESSION.sql_mode다음 중 하나를 사용할 수 있습니다.

SET SESSION sql_mode = sys.list_drop(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY');
SET sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');

서비스가 다시 시작될 때까지 GLOBAL.sql_mode현재 런타임 조작에 대해 지속 되는 모드를 제거합니다 .

SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');

MySQL 5.7.8 또는 이전

때문에 sql_mode값이 모드의 CSV 문자열, 당신은 문자열을 사용하여 수행 할 수 있습니다 잔류 쉼표를 포함하지 않도록해야합니다 TRIM(BOTH ',' FROM ...).

sql_mode변수 에서 모드를 제거하려면 쉼표를 제거하기 위해 REPLACE()함께 사용하려고합니다 TRIM().

SET SESSION sql_mode = TRIM(BOTH ',' FROM REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', ''));

sql_mode변수에 모드를 추가하려면 을 사용 CONCAT_WS(',', ...)하여 쉼표에 현재 모드를 추가하고 TRIM()나머지 쉼표를 제거하십시오.

SET SESSION sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@SESSION.sql_mode));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@GLOBAL.sql_mode));

참고 : 새 연결이 설정 될 때까지 변수 를 변경해도 GLOBAL변수로 전파 되지 않습니다SESSION .

GLOBAL실행중인 서비스를 다시 시작할 때까지 변수는 유지됩니다.

SESSION접속이 폐쇄되고 새 접속이 확립 될 때까지 변수는 현재 연결 지속될 것이다.


로 복귀 GLOBAL.sql_mode

이후 SET sql_mode = 'ONLY_FULL_GROUP_BY';를 빼고 실행 된 GLOBAL수정, 변경은 현재의 영향 SESSION도에 관한 상태 값, @@sql_mode. 이를 제거하고 서버 다시 시작시 글로벌 기본값으로 되돌리려면 의 값을 사용하려고합니다 @@GLOBAL.sql_mode. [sic]

현재 SESSION값은 현재 연결에만 유효합니다. 서버에 다시 연결하면 값이 다시 값으로 되돌아갑니다 GLOBAL .

현재 세션 상태 값을 현재 전역 값으로 되돌리려면 다음 중 하나를 사용할 수 있습니다.

SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;

변경 SESSION.sql_mode가치ONLY_FULL_GROUP_BY

SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+--------------------+----------------------------------------------+
| @@sql_mode         | @@GLOBAL.sql_mode                            |
+--------------------+----------------------------------------------+
| ONLY_FULL_GROUP_BY | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+--------------------+----------------------------------------------+

되돌리기 SESSION.sql_mode받는 값을 GLOBAL.sql_mode

SET sql_mode = @@GLOBAL.sql_mode;
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+----------------------------------------------+----------------------------------------------+
| @@sql_mode                                   | @@GLOBAL.sql_mode                            |
+----------------------------------------------+----------------------------------------------+
| NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------+----------------------------------------------+

서버 재시작 지속 sql_mode

서버 시작시 SQL 모드 를 설정하려면 --sql-mode="modes"명령 행 또는 sql-mode="modes"my.cnf (Unix operating systems) 또는 my.ini (Windows)와 같은 옵션 파일에서 옵션을 사용하십시오. [sic]

지원되는 기본 모드 를 결정하려면 사용중인 MySQL 버전을 참조하십시오 .

[mysqld]

sql-mode="NO_ENGINE_SUBSTITUTION" #default <= 5.7.4

기본 sql_mode

MySQL 문서 버전 별 값이 제거되었으므로 참조 용으로 여기에 추가했습니다.

MySQL> = 8.0.11 8.0.5-8.0.10 건너 ped

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.8, <= 8.0.4

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL 5.7.7

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.5, <= 5.7.6

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION

MySQL> = 5.6.6, <= 5.7.4

NO_ENGINE_SUBSTITUTION

MySQL <= 5.6.5

''

8

MySQL 8.0.11을 사용하는 경우 sql-mode에서 'NO_AUTO_CREATE_USER'를 제거해야합니다.

파일 /etc/mysql/my.cnf과 [mysqld] 헤더 에 다음 줄 추가

[mysqld]

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

지금까지이 답변이 8.0.13 작동
tomexsans

7

나는 교리를 사용하고 있으며 doctrine.local.php에 driverOptions를 추가했습니다.

return array(
'doctrine' => array(
    'connection' => array(
        'orm_default' => array(
            'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
            'params' => array(
                'host' => 'localhost',
                'port' => '3306',
                'user' => 'myusr',
                'password' => 'mypwd',
                'dbname' => 'mydb',
                'driverOptions' => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
                ),
            ),
        ),
    ),
));

phpmyadmin에서 사용자는 특권에서 SUPER을 활성화해야합니다.


3
Doctrine을 구성하기 위해 yaml 표기법을 사용하려면 (Symfony에서와 같이) 상수 "PDO :: MYSQL_ATTR_INIT_COMMAND"대신 "1002"를 사용해야하지만 그럼에도 불구하고 이것이 몇 주 전에 찾고 있었지만 찾을 수 없었습니다. 밖. 솔루션 주셔서 감사합니다! 나를 위해 일했다.
Arvid

5

cPanel / WHM 과 함께 VPS / Server를 실행중인 사용자는 다음을 수행하여 ONLY_FULL_GROUP_BY를 영구적으로 비활성화 할 수 있습니다

루트 액세스 권한이 필요합니다 (VPS 또는 전용 서버에서)

  1. 루트로 WHM을 입력하고 phpMyAdmin을 실행하십시오.

  2. 변수를 클릭하고을 찾아 sql_mode'편집'을 클릭 한 다음 해당 텍스트 상자 안의 전체 줄을 복사하십시오.

예를 들어 이것을 복사하십시오 :

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  1. SFTP-SSH (루트)를 통해 서버에 연결하고 파일을 다운로드하십시오. /etc/my.cnf

  2. my.cnf로컬 PC에서 텍스트 편집기 파일로 열고 [mysqld]2 단계에서 복사 한 전체 행을 섹션 아래에 붙여 넣습니다 ( 제거).ONLY_FULL_GROUP_BY,

예를 들어 붙여 넣기

# disabling ONLY_FULL_GROUP_BY
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. my.cnf파일을 저장하고 다시 업로드/etc/

  2. WHM을 입력하고 "WHM> 서비스 다시 시작> SQL Server (MySQL)"로 이동하여 서비스를 다시 시작하십시오.


4

mysql로 ​​작업하고 루트 사용자로 등록 된 저에게 맞는 솔루션은 다음과 같습니다.

mysql> 세션 설정 sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));


3

이것은 Ubuntu 14+의 MySql 5.7+에 대한 영구 솔루션입니다.

$ sudo bash -c "echo -e \"\nsql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"  >> /etc/mysql/mysql.conf.d/mysqld.cnf"
$ sudo service mysql restart
# Check if login attempt throws any errors
$ mysql -u[user] -p # replace [user] with your own user name

오류없이 로그인 할 수 있다면 이제 모두 설정되어 있어야합니다.


1

구성 파일을 사용하여 비활성화 할 수 있습니다 my.cnf.

$ mysql --verbose --help | grep my.cnf

따라서 macOS 10.12에서는 usr/local/etc/my.cnf입니다. sql_mode여기에서 편집 할 수 있습니다 :

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
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

다음은 phpmyadmin 대시 보드를 통해 Mysql 구성을 변경하는 솔루션입니다.

"sql_mode = only_full_group_by와 호환되지 않습니다"를 수정하려면 : phpmyadmin을 열고 홈 페이지로 이동하여 '변수'하위 메뉴를 선택하십시오. 아래로 스크롤하여 SQL 모드를 찾으십시오. SQL 모드를 편집하고 'ONLY_FULL_GROUP_BY'를 제거하십시오. 저장하십시오.


0

사용하여 MySQL의 버전 5.7.28 확인
SELECT @@sql_mode; 및 업데이트와

SET @@sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.