문제
로그에 갑자기 이런 에러가 발생했다.
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
'Spring' 카테고리의 다른 글
[Spring + Kotlin] Jackson 역직렬화할 때 프로퍼티명 2번째 대문자가 소문자로 변하는 문제 해결 방법 (0) | 2024.11.07 |
---|---|
[Spring] Spring Boot + Kotlin + MyBatis 프로젝트 설정 방법 (3) | 2024.03.26 |
[Spring] 재시도할 때 사용하는 @Retryable, @Recover 사용법 (1) | 2024.02.26 |
[Spring] Kotest 병렬 테스트 설정 방법 (23) | 2023.12.31 |
[Spring] Gradle Test events were not received 해결 방법 (21) | 2023.12.28 |
댓글