티스토리 뷰
DB를 다룰 땐 사소해보이지만 아주 중요한 부분이 있다. 그것이 Collation인데, 이건 DB에 문자를 저장하거나 비교할 때 적용되는 규칙이라고 생각하면 된다.
'가'라는 Collation에서는 'A'와 'a'를 같다고 보지만 '나'라는 Collation에서는 'A'와 'a'가 다르다고 하자. 그러면 '가'에서는 'Apple'이나 'apple'이나 같다. 하지만 '나'에서는 'Apple'과 'apple'은 엄연히 다른 것이다.
이렇게 문자를 저장하거나 비교할 때 적용되는 규칙은 컬럼 단위로 다르게 정할 수도 있고 테이블 단위로 다르게 정할 수도 있는데, 중요한 것은 MySQL에서는 서로 다른 collation의 컬럼을 비교하는 것을 막고 있다.
예를 들어, utf8mb4_general_ci인 컬럼과 utf8mb4_unicode_ci인 컬럼을 '='로 비교하려고 하면 아래와 같은 에러가 발생한다.
java.sql.SQLException:
Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='
이때는 아예 DDL에서 변경해주는 방법도 있고, 단순히 비교를 해야 하는 이번 케이스 때문에 collation을 바꾸기 좀 그렇다면 아래와 같이 쿼리 사용시 COLLATE를 명시하는 방법이 있다.
-- a가 utf8mb4_unicode_ci
-- b가 utf8mb4_general_ci
WHERE a COLLATE utf8mb4_general_ci = b;
COLLATE가 성능상 영향을 줄 지 안 줄 지(주긴 줄거같은데) 얼마나 줄지는 좀 더 알아봐야겠다. 참고로 ChatGPT한테 물어보니 COLLATE를 사용하면 역시나 인덱스를 적용할 수 없다고 한다.
또 한 가지 궁금한 것. 스프링부트 프로젝트로 실행하면 저렇게 에러가 나는데 DataGrip에서 쿼리만 따로 실행하면 문제없이 실행이 잘 된다. 왜 그럴까?
그리고 utf8mb4_general_ci와 utf8mb4_unicode_ci 중 권장은 utf8mb4_unicode_ci라고 한다.
'업무 경험 및 성과' 카테고리의 다른 글
Collation에 따라 LIKE와 '=' 검색결과가 달라질 수 있다 (0) | 2023.10.17 |
---|---|
"사내서버 알고보니 코인채굴중?!"을 막기 위해 Apache Guacamole(아파치 과카몰리)를 알아보자 (0) | 2023.10.17 |
커밋 안 한 작업 날렸을 때(혹은 삭제한 파일 다시 보고 싶을 때) 마지막 희망, 로컬 기록 (0) | 2023.10.13 |
HTTP 메시지 시작줄이 잘못되어 있으면 어떻게 될까? (1) | 2023.09.20 |
간단하게 디스크 용량이 부족할 경우의 테스트 환경 만들기 (0) | 2023.09.04 |