MySQL 8 의 character set 과 collation 변경 사항
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;
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 );
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', 'è');