mysql

[mysql]collation

쭌탱 2023. 1. 14. 22:32

mysql 에서 collation 은 문자열을 비교하고 정렬하는데 사용되는 룰(rule) 의 집합입니다.

collation 은 아래와 같이 4가지 레벨에서 설정이 가능합니다. 

  1. Server
  2. Database
  3. Table
  4. Column

Sever 레벨에서 설정은 서버의 모든 데이터베이스, 테이블에 동일하게 적용됩니다.

마찬가지 Database 레벨에서의 설정은 동일 데이터베이스이 모든 테이블에 동일하게 적용됩니다.

DBeaver 에서 데이터베이스에 설정된 collation  을 확인하는 방법은 아래와 같습니다. 

 

예를 들어 아래 그림에서 cms_qa 데이터베이스를 클릭하면 

 

아래와 같이 데이터베이스에 대한 상세정보 페이지가 나오고 기본적으로 설정되어 있는 collation  을 확인할 수 있습니다. 

 

또는 아래와 같이 간단한 쿼리를 통해 디폴트 collation 과 해당 charcterset 에서 지원하는 collation 목록을 볼수 있습니다

SHOW collation like 'utf8mb4%'

 

 

collation 은 각 문자에 가중치(weight) 를 부여합니다. 이 값은 각 문자를 비교하는데 사용합니다.

만약 두 문자가 가중치가 같다면 같은 문자,  다르면 다른 문자인것입니다. 

 

아래 예제를 통해 간단히 실험해 보겠습니다. 

쿼리를 간단히 설명드리면 collation 에 의해 부여된 문자의 가중치값을 보여주는 WEIGTH_STRING 함수를 이용하여 두문자의 가중치를 HEX 형태로 출력합니다.

 

실험 1. collation  으로 utf8mb4_general_ci 를 사용하여 문자 'A', 'B' 의 가중치 구하기 

 

-쿼리

SELECT HEX(WEIGHT_STRING('A' COLLATE utf8mb4_general_ci)), HEX(WEIGHT_STRING('B' COLLATE utf8mb4_general_ci));

 

-결과

 

 

 

실험 2. utf8mb4_general_ci 에서 마지막 ci 는 case insensitive 즉 대소문자를 구별하지 않는 것을 의미합니다. 

문자  'A' 와 'a'  의 가중치가 같은지 확인해봅니다. 

 

 

-쿼리

SELECT HEX(WEIGHT_STRING('A' COLLATE utf8mb4_general_ci)), HEX(WEIGHT_STRING('a' COLLATE utf8mb4_general_ci));

 

-결과

 

 

 

실험 3. utf8mb4_bin 을 사용하여 문자 문자  'A' 와 'a'  의 가중치가 다른지 확인해 봅니다. 

 

-쿼리

SELECT HEX(WEIGHT_STRING('A' COLLATE utf8mb4_bin)), HEX(WEIGHT_STRING('a' COLLATE utf8mb4_bin));

 

-결과

 

 

 

참고 

https://dev.mysql.com/doc/refman/8.0/en/adding-collation.html

https://www.mysqltutorial.org/mysql-collation/