본문 바로가기
Dev/DataBase

[MariaDB] ERROR 1267 illegal mix of collations ...

by nakanara 2023. 1. 16.
반응형
SQL Error 1267 illegal mix of collations (utf8mb4_general_ci, IMPLICIT) and (utf8mb4_unicode_ci, IMPLICIT) for operation '='

MariaDB에서 인의적 데이터를 만든 경우 DB의 정렬 기준과 테이블 컬럼의 정렬 기준이 다른 경우 발생합니다.
DB의 정렬 속성이 테이블의 정렬 속성과 다른지 확인이 필요합니다.

-- 오류 발생을 위해 CONVERT 사용 쿼리
WITH recursive downward AS (
   -- 하향쿼리 
   SELECT CONVERT('ID-001', VARCHAR(100)) id, convert('', varchar(100)) pid
   UNION ALL
   SELECT convert(wfr_tgt_id, VARCHAR(100)) id, CONVERT(wfr_src_id, VARCHAR(100)) pid
   FROM test_table ct, downward pt
   WHERE pt.id = ct.wfr_src_id
   AND ct.wfr_src_id != ct.wfr_tgt_id
)
SELECT * FROM downward

테이블 정보
DB 설정 정보

해결 방안1

DB 설정파일(my.cnf)을 변경하여 collation_connection 속성 변경
collation_connection 속성의 경우 별도 설정 항목이 없음 기본적으로 utf8mb4_general_ci 로 설정됨

SET collation_connection='utf8mb4_unicode_ci'

[mysqld]
init-connect            = "SET NAMES utf8mb4; SET collation_connection='utf8mb4_unicode_ci'"

해결 방안 2

WITH recursive downward AS (
   -- 하향쿼리 
   SELECT CONVERT('ID-001', VARCHAR(100)) collate UTF8MB4_UNICODE_CI id, convert('', varchar(100)) pid
   UNION ALL
   SELECT convert(wfr_tgt_id, VARCHAR(100)) id, CONVERT(wfr_src_id, VARCHAR(100)) pid
   FROM test_table ct, downward pt
   WHERE pt.id = ct.wfr_src_id
   AND ct.wfr_src_id != ct.wfr_tgt_id
)
SELECT * FROM downward

참고

* https://mariadb.com/kb/en/server-system-variables/#collation_connection

* https://stackoverflow.com/questions/44027987/illegal-mix-of-collations-utf8mb4-unicode-ci-implicit-and-utf8mb4-general-ci

반응형