incompatible with sql_mode=only_full_group_by (feat. MySQL)

Photo by Possessed Photography on Unsplash


요약

  • MySQL 이용 중 "this is incompatible with sql_mode=only_full_group_by" 오류가 나는 경우 해결 방법은 크게 2가지가 있다. 
  • 설정에서 only_full_group_by를 비활성화거나, 쿼리를 수정한다.  



sql_mode=only_full_group_by

MySQL 서버에 설정된 sql_mode가 "only_full_group_by"라면 쿼리에서 group by 절에 관련 컬럼을 모두 기술해야 결과를 확인할 수 있다. 기술하지 않으면 다음과 같은 에러 로그를 출력한다. 

mysql.connector.errors.ProgrammingError: 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'b.deal_cnt' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 



왜 발생했을까?

노트북에 설치한 MySQL 서버를 이용해서 개발할 때는 아무 문제가 없었다. 개발 다 했다 생각하고 github에 push 한 후, 서버(Ubuntu)에 배포하니 에러가 발생했다. 이상하다. 노트북과 서버에 MySQL을 설치할 때 별다른 옵션 없이 기본 모드로 설치했는데, 왜 다를까? 버전과 설정을 확인해 보자. 

노트북에 설치한 MySQL

  • version: 8.0.25
  • version_comment: MySQL Community Server - GPL
  • select @@sql_mode;
    • STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

서버(Ubuntu)에 설치한 MySQL

  • version: 8.0.27-0ubuntu0.20.04.1
  • version_comment: (Ubuntu)
  • select @@sql_mode;
    • ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

기본 설치를 했어도 윈도우와 서버(Ubuntu)는 설정이 다르구나. 역시 개발환경과 운영환경은 똑같이 맞춰야 해. 



어떻게 해결할까?

검색해 보니, 친절한 설명들이 많다. 정석은 쿼리를 표준에 맞게 수정하는 것이겠지만, 토이 프로젝트에 그렇게까지 하기는 좀… 서버에 설치한 MySQL 설정에서 only_full_group_by를 빼버렸다. 간단히 설명하면 /etc/mysql/mysql.conf.d/mysqld.cnf 파일 끝에 아래 내용을 추가했다.

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION



댓글 쓰기

0 댓글