MySQL 8 이 release 되고 드디어 기본 캐릭터 셋이 latin-1 에서 utf8mb4 로 변경되었습니다.


이에 맞게 기본 collation 도 utf8mb4_0900_ai_ci 로 변경되었는데 collation 이름이 너무 어려워서 무슨 의미인지 찾아보니 다음과 같은 뜻이 있다고 합니다.

  • uft8mb4 : 각 character 는 최대 4 byte 의 UTF-8 인코딩을 지원(이모지와 특수 문자도 문제 없음)
  • 0900 : Unicode 의 collation algorithm 9.0.0 을 지원 (가장 최신의 유니코드 표준).
  • ai : accent insensitivity. 그래서 다음 문자들은같은 문자로 취급함(e, è, é, ê and ë)
  • ci: case insensitivity. 그래서 p 와 P 를 같은 순서로 취급


collation 은 정렬시외에도 다음의 경우에도 제공되니 주의깊게 설정해야 합니다.

  • 정렬시(ORDER BY)
  • LIKE 검색
  • Index 생성시
  • Primary Key 나 Unique constraint 검사시
  • =, != 등 비교 연산자
  • string 관련 function

Character set 을 변경해야 하는지?

기존 문자 셋이 utf8mb4 가 아니라면 무조건 변경하는 것을 권장합니다.

다국어를 지원하지 않는 서비스라도 Emoji 나 특수 문자를 원활하게 사용하려면 utf8mb4 가 필요합니다.


테이블별로 character set 을 변경하려면 아래 SQL 을 실행하면 됩니다.

table character set 변경

ALTER TABLE foo CONVERT TO CHARACTER SET utf8mb4;
SQL


Collation 을 변경해야 하는지?

collation 을 utf8mb4_0900_ai_ci 으로 변경하는 것은 생각보다 쉽지 않은 문제인 것 같습니다. 일반적으로 정렬에만 영향을 준다고 알고 있지만 Index, Primary Key, Unique Constraint 에 영향을 주므로 다개국어 데이타가 있는 큰 데이터베이스는 collation 변경의 영향을 측정하기가 어렵습니다.


예로 아래와 같이 테이블 에 unique constraint 가 있는 컬럼이 있을 경우 

table 생성

create table  test(
  id int auto_increment primary key ,
  n varchar(20),
  u varchar(20) unique
);
SQL


2번째 insert 구문은 utf8mb4_0900_ai_ci  collation 을 사용할 경우 "23000 Duplicate entry" 에러가 발생합니다.

insert into test(n, u) values('n', 'e');
insert into test(n, u) values('n', 'è');  
SQL


같이 보기

Ref