2015년 12월 12일 토요일

MYSQL에서 utf8_general_ci 와 utf8_unicode_ci 차이

MYSQL에서 테이블을 생성하는데, 기본 문자 셋(Character set)과 콜레이션(Collation)을 선택하게 된다. utf8의 default collation은 utf8_general_ci이다.  이때 utf8_general_ci 와 utf8_unicode_ci의 차이점이 궁금해졌다. 아래 내용은 블로그에서 스크랩해본 내용입니다.

기본 문자 셋(Character set)과 콜레이션(Collation)
  • 문자셋(Character set) : 각 문자가 컴퓨터에 저장될 때 어떠한 '코드'로 저장될지에 대한 규칙의 집합
  • 콜레이션(Collation) : 특정 문자 셋에 의해 데이터베이스에 저장된 값들을 비교 검색하거나 정렬 등의 작업을 위해 문자들을 서로 '비교' 할때 사용하는 규칙들의 집합

UTF8_General_ci는 다국어에서 사용되는 억양, 강세를 모두 떼어내고 대소문자 정규화(대문자를 모두 소문자로 변환) 해서 비교를 수행하게 된다. 즉 "AAAaāă"와 같은 문자들은 모두 문자 위의 Accent를 제거하고 소문자로 변경하면 "a"가 되는 식이다. 그래서 "A"=="A"=="A"=="a"=="ā"=="ă" 인 것이다.
UTF8_Unicode_ci는 확장문자("ß", "A", ...) 나 연자활자("Œ", ...)의 정렬이나 비교를 100% 지원할 수 있다. 즉, 다양한 문자의 정렬이나 비교를 수행할 수 있게 되는 것이다.
수집한 내용에 따르면, UTF8_General_ci을 기본 콜레이션으로 사용하는 이유는 왠만한 문자셋과 잘 맞고 특별히 문제를 일으키지 않기 때문이라고 한다.

utf8_general_ci와 utf8_unicode_ci의 성능 비교
아래 예제는 UTF8_Unicode_ci와 UTF8_General_ci로 20글자 정도의 문자열 비교를 1천만번 비교하는 테스트를 해본 결과이다.

utf8_general_ci
mysql> set names utf8 collate utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)
mysql> select benchmark(10000000, '1234567890abcdefgß'='1234567890abcdefgs');
+-----------------------------------------------------------------+
| benchmark(10000000, '1234567890abcdefgß'='1234567890abcdefgs')  |
+-----------------------------------------------------------------+
|                                                               0 |
+-----------------------------------------------------------------+
1 row in set (1.19 sec)

utf8_unicode_ci
mysql> set names utf8 collate utf8_unicode_ci;
Query OK, 0 rows affected (0.00 sec)
mysql> select benchmark(10000000, '1234567890abcdefgß'='1234567890abcdefgs');
+-----------------------------------------------------------------+
| benchmark(10000000, '1234567890abcdefgß'='1234567890abcdefgs')  |
+-----------------------------------------------------------------+
|                                                               0 |
+-----------------------------------------------------------------+
1 row in set (5.93 sec)

사실 별 차이 없을 거라고 생각했었는데, 생각보다 큰 차이가 난다는 것을 알 수 있다.
UTF8_General_ci의 Collation이 얼마나 단순화되었는지, 그로 인해서 얼마나 성능이 나아졌는지 알 수 있다.
그리고, UTF8_Unicode_ci는 속도가 조금 느린 대신, 러시아어, 불가리아어, 벨라루시아어, 마케도니아어, 세르비아어, 우크라이나어 등의 정렬이나 비교를 완벽하게 지원하는 장점을 가지고 있는 것이다.

참고
  • http://cafe.naver.com/realmysql/52
  • http://jinolog.com/programming/mysql/2011/03/21/character-set-and-collation.html

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.