Hello

[MySQL] Charset과 Collation개념 및 조합 본문

DB

[MySQL] Charset과 Collation개념 및 조합

nari0_0 2024. 8. 2. 10:52
728x90

Charset(문자 집합) 문자열 데이터를 어떻게 해석하고 저장할지를 결정하는 규칙

MySQL 5.7 이하는  latin1, MySQL 8은 utf8mb4

Collation은 특정 문자 셋(Character set)에 의해 저장된 값을 비교하기 위해 사용하는 규칙의 집합

 

해외 프로젝트를 진행중 닉네임 조회 결과가 의도와 다르게 동작하는 이슈가 발생했습니다.ex) 아래 예시들이 구분되어 조회되지않음

영어

닉네임 : abc
닉네임 : ABC

대만어

닉네임 : tong
닉네임 : tóng

베트남어

닉네임 : ma
닉네임 : má 

 

대소문자 및 성조 관련 이슈가 있었는데, 해당 프로젝트는 mysql 8 기본 collation(utf8mb4_0900_ai_ci)을 사용하고 있었습니다. utf8mb4_0900_ai_ci는 위의 예시와 같은 문자를 같은 문자열로 인식하여 처리 하기 때문에 글로벌 서비스인 경우 collation설정을 확인해야합니다.

기본 컬렉션 조합 의미

  •  
  • utf8mb4 : 각 문자가 UTF-8 인코딩 체계에서 MaxByte 4로 저장된다는것을 의미합니다.
  • 0900 : Unicode Collation Algorithm 버전을 나타냅니다. Unicode Collation Algorithm은 유니 코드 표준의 요구 사항을 준수하는 두 개의 유니 코드 문자열을 비교하는 데 사용되는 방법입니다.
  • ai : 악센트를 구분하지 않음을 나타냅니다. ex) 정렬 할 때 e, è, é, ê 및 ë 사이에는 차이가 없습니다
  • ci : 대소문자를 구분하지 않습니다. ex) 정렬 할 때 p와 P 사이에 차이가 없다는 것입니다.

성조 및 대소문자를 구분 하지 않는 문자조합을 사용하고 있어 이를 악센트 감도 및 대소문자 구분정렬이가 가능한 collation으로 변경이 필요했습니다.

컬렉션 규칙

규칙을 참고해 악센트, 대소문자를 구분하는 utf8mb4_0900_as_cs로 변경해 이슈 해결되었습니다.

 

 

참고 :

 

https://rastalion.dev/mysql-8-0-1

https://www.percona.com/blog/charset-and-collation-settings-impact-on-mysql-performance/

https://atl.kr/dokuwiki/doku.php/charset_collation_-_utf8_unicode_ci_and_utf8mb4_0900_ai_ci

https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-sets.html

https://dev.mysql.com/doc/refman/8.4/en/charset-mysql.html

728x90