[Spring] Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=', 'UNION'
문제
로그에 갑자기 이런 에러가 발생했다.
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