기본 문자 셋(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
댓글 없음:
댓글 쓰기
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.