본문 바로가기
Spring

[Spring] Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=', 'UNION'

by 노력남자 2024. 3. 30.
반응형

문제

 

로그에 갑자기 이런 에러가 발생했다.

 

Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

Illegal mix of collations for operation 'UNION'

 

?? 뭐지

 

원인

 

MySQL을 5.7에서 8.x로 버전 업을 했는데 이게 바로 원인이었다.

 

8.0부터 기본 collation이 utf8mb4_0900_ai_ci로 바꼈다고 한다.

 

그래서 CAST 함수에 collate 옵션을 안 주고 그냥 썼을 경우 기본값인 utf8mb4_0900_ai_ci로 변환이 됐다.

 

db collation 설정이 utf8mb4_general_ci로 되어있음에도 불구하고 저렇게 변환이 된다;; 뭐지;;

 

그래서 collation이 다른 컬럼끼리는 비교, UNION을 할 수 없다.라는 에러가 발생한 거다.

 

에러

 

Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

 

 

문제 쿼리

 

a.id << utf8mb4_general_ci = CAST(b.id as char(10) << utf8mb4_0900_ai_ci

 

 

에러

 

Illegal mix of collations for operation 'UNION'

 

문제 쿼리

 

SELECT CAST(a.id AS char(20)) AS id << utf8mb4_0900_ai_ci
FROM a
UNION
SELECT b.id AS id << utf8mb4_general_ci
FROM b

 

해결책

 

1. CAST(a.id AS char(20)) collate utf8mb4_general_ci << collate 옵션 추가

 

2. CONCAT(a.id, '')

 

Collation이란?

 

DB collation은 데이터베이스에서 문자열 데이터를 정렬하고 비교하는 방법을 결정하는 설정입니다. 문자열 데이터베이스 필드에서 사용되며, 데이터베이스 시스템이나 관리자가 데이터 정렬 및 비교 동작을 제어할 수 있게 합니다.

DB collation은 다양한 언어 및 문자 집합에 따라 다르며, 일반적으로 정렬 순서, 비교 동작, 대소문자 구분 여부 등을 결정합니다. 예를 들어, 한국어와 영어를 모두 포함하는 데이터베이스의 경우 한국어와 영어의 정렬 및 비교 방식이 다를 수 있으므로 적절한 collation을 선택하는 것이 중요합니다.

 

MySQL Collation 조회, 변경 방법

 

https://velog.io/@mooh2jj/MySQL-Character-Set-Collation-%ED%99%95%EC%9D%B8

반응형

댓글