home

Utf8mb4_general_ci와 utf8mb4_bin의 차이

utf8mb4_general_ci와 utf8mb4_bin의 차이

utf8mb4_general_ci

utf8mb4 문자 집합을 사용하며, 최대 4바이트 유니코드 문자를 지원하여 이모지 등도 가능합니다. 그리고 general_ci  대소문자를 구분하지 않는 콜레이션입니다. 그래서 문자를 비교할 때 대소문자를 무시합니다.

그렇다보니 문자 간의 세밀한 비교를 할 때는 적합하지 않지만, 일반적으로 대소문자를 비교하지 않아도 될 때 많이 사용합니다.

utf8mb4_bin

마찬가지로 utf8mb4 문자 집합을 사용하며, bin 은 바이너리 비교 방식입니다. 그래서 문자열을 바이트 단위로 아주 엄격하게 비교를 합니다.

그래서 general_ci와는 다르게 대소문자를 구분하고, 문자 인코딩의 실제 바이트 값으로 문자 간의 일치 여부를 판단합니다. 성능이 utf8mb4_general_ci 보다 빠르지만, 일반적인 서비스에서 직관적인 문자 정렬이나 비교는 아닐 수 있을 것 같습니다.

그렇다면 mysql 8.0 이상에서는 어떤 컬레이션을 기본으로 사용할까요?

utf8mb4_0900_ai_ci

이 콜레이션은 mysql 8.0 이상 버전의 기본 콜레이션으로, 대소문자 구분 없이 + 악센트 구분 없이 비교합니다. 0900 는 유니코드 정렬 알고리즘의 버전이고, 유니코드 9.0.0 기준으로 문자열을 정렬하고 비교합니다. ai 는 악센트 무시, 즉 성조를 무시하고 ci 는 대소문자 무시를 뜻합니다.

이런 특성이 있다보니 general_ci와 비교가 되곤 합니다. 성능적인 면에서는 0900_ai_ci가 general_ci에 비해서 좋지 못한데, 이유는 Unicode의 최신 표준을 엄격하게 적용하고 있고, 이에 따라 비교 처리가 복잡해지기 때문에 그렇다고 합니다.


대체 왜 우리 상품 테이블은 utf8mb4_bin로 되어있었을까? 🤔 이유가 있었을텐데 .. general_ci로 fulltext index 걸려있는 필드들과 테이블의 콜레이션을 변경해서 해결하였습니다.