DBeaver - collate 오류(SQL Error 1267) 해결 방법

이번주에 유관부서의 성과분석을 위해 수치를 추출해 줘야 하는 일이 있었습니다. (데이터 담당자가 없어서 왠만한 건 제가 뽑아줄 때가 많습니다..^^)

 

근데 그러던 도중 아래와 같은 DBeaver에서 오류가 떴습니다. (ㅠ..)

------

SQL Error [1267] [HY000]: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='

------

 

난생 처음보는 오류에 '대체 무슨 오류인 거야? 영어만 읽어봤을 땐 뭔가 데이터간에 비교 연산자가 불가능하다고 하는 것 같은데···'라는 생각이 들었습니다. 그래서 오늘도 저의 친구 구글을 통해 오류 해결법을 찾아보았습니다.

 

자료를 좀 찾아보니 collate 오류는 서로 다른 테이블끼리 비교할 때 Collation(정렬되는 기준)이 다르면 발생하는 오류라고 합니다. 다행히도 저의 경우엔 아래처럼 쿼리를 수정했더니 쉽게 해결되었습니다.

(사실 SET 함수를 통해 전체 테이블을 수정하고 조회하는 방법도 있는 듯했는데, 저는 최대한 단순한 방법을 사용하고자 하였습니다.)

 

As-is 쿼리

 
SELECT * FROM
	(SELECT * FROM TABLE1
	GROUP BY columnA) TA
INNER JOIN 
	TABLE2 TB ON TA.columnA = TB.columnB;

 

To-be 쿼리

특별한 건 없고 연산자를 사용했던 줄에서 문제가 발생했던 것이니 'COLLATE utf8_general_ci'를 붙여주었다. 여기서 collate의 뜻은 '대조하다', '맞춰보다'이기 때문에 서로 맞지 않는 것을 맞추겠다 정도로 이해하면 될 듯합니다.

SELECT * FROM
	(SELECT * FROM TABLE1
	GROUP BY columnA) TA
INNER JOIN 
	TABLE2 TB ON TA.columnA = TB.columnB COLLATE utf8_general_ci;

 

*참고: utf8_general_ci 말고 utf8_unicode_ci를 사용하여 해결할 수도 있는데, 속도와 정확도의 차이가 조금 있을 뿐 한국어에서는 큰 영향을 주지는 않는다고 하여 저는 general로 선택하여 사용했습니다.