에러 메시지
Error Code: 1055. Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column '데이터베이스.테이블.컬럼' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by 0.000 sec
1. 원인
XML 파일 내 SQL문에서 에러가 발생했다.
에러 코드 1055는 SQL 모드가 ONLY_FULL_GROUP_BY로 설정되어 있을 때 발생하는 문제이다.
이 모드는 GROUP BY 절에 포함되지 않은 모든 열이 SELECT 목록에 있을 때,
이 열들이 집계 함수로 처리되지 않으면 오류를 발생시킨다.
이를 해결하기 위해서는 다음과 같은 방법을 사용할 수 있다.
- SQL 쿼리 변경 : 모든 열을 GROUP BY 절에 추가하거나, 집계 함수 사용
- my.ini 수정 : sql_mod 수정
하지만 프로젝트 파일 내 XML 파일의 SQL 쿼리를 내가 임의로 변경할 수는 없기 때문에
my.ini의 sql_mod를 수정하는 방법을 택했다.
보통은 XML 파일의 SQL 쿼리를 변경하는 것이 더 좋다.
왜냐하면 sql_mod에서 ONLY_FULL_GROUP_BY 설정을 지워버리면
같은 의도를 가지고 작성한 SQL 쿼리라도 쿼리가 달라질 수 있고, 결과물 또한 달라질 수 있기 때문이다.
결과가 예측하지 못한 방식으로 출력될 수 있기 때문에 주의가 필요한 방식이다.
실제로, ONLY_FULL_GROUP_BY 설정이 활성화되면
GROUP_BY 절에 포함되지 않은 열이 SELECT 절에 있을 때,
해당 열이 집계 함수로 감싸지지 않으면 에러가 발생하게 되어 있다.
이는 데이터의 일관성을 보장하기 위한 조치이다.
2. 해결
2-1. MySQL 서비스 중단
관리자 권한으로 실행한 cmd에 아래 명령어를 입력하여 MySQL 서비스를 중단한다.
net stop mysql
2-2. MySQL 설정 파일 수정 및 저장
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
나의 경우, 위의 경로에 my.ini 파일이 위치해있다.
my.ini를 실행하여 [mysqld] 영역에 sql-mod의 값 중 'ONLY_FULL_GROUP_BY' 값을 삭제한다.
// 기존
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"
// 수정 : 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"
2-3. MySQL 서비스 시작
다시 관리자 권한으로 cmd를 실행하여 아래 명령어를 입력해 MySQL 서버를 시작한다.
net start mysql
'[Project] > 업무일지' 카테고리의 다른 글
[Java/JavaSwing] POS 시스템 내 MakeLine 범핑 옵션기능 추가 (0) | 2024.07.29 |
---|---|
java.sql.SQLException: Illegal mix of collations (euckr_korean_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '=' (0) | 2024.07.26 |
[Java] 배민원, 쿠팡이츠 계산 예외처리 (0) | 2024.07.22 |
[Java] 화면에 custcnt 데이터 반환 되지 않는 이슈 해결 (0) | 2024.07.18 |
[Java] NumberFormatException: For input string: "null" (1) | 2024.07.18 |