일전에 모임 했을 때 Collation 이야기가 나왔었는데요.
이에 대해 간단히 이야기해 볼까 합니다.
당연히… Collation을 아시는 분들이 많을 텐데요.
Collation을 그대로 번역하면 “책 페이지 순서”입니다.
우리나라 한글로 하면 “가나다”순 인데요.
이것을 각 나라 언어를 어떤 기준으로 정렬할 지 나타낸 것이라고 보면 되겠군요.
한글용어로는 “데이터 정렬”이라는 용어를 사용합니다.
SELECT SERVERPROPERTY(N'Collation')
명령으로 현재 기본 Collation을 확인할 수 있습니다. 물론 DB마다, Table마다 다른 정렬을 사용할 수 있습니다.
보통 Latin1_General_ CI_AS_KI_WI 이런 식으로 되어 있는데요.
이것을 나눠서 살펴 보도록 하겠습니다.
1. Latin1_General : 언어구성을 말합니다. 각 나라의 언어를 영문으로 표기하는 부분입니다.
- 한글은 Korean_Wansung (한글 완성형, 흠… 완성형/조합형 에 대한 설명은 패스~)
- 중국어는 Chinese_PRC
보통 이런 식입니다.
2. CI : 대/소문자 구분 부분을 말합니다.
- CI : Case Insensitive - 대/소문자를 구분하지 않음을 말합니다.
- CS : Case Sensitive – 대/소문자를 구분합니다.
대문자와 소문자가 구분되어 있는 나라가 아니면 CI 를 사용한다고 보시면 됩니다.
즉, 영어의 A와 a 를 같은 것으로 볼 것인지 결정하는 것이죠.
CI일 경우 A와 a를 같게 인식합니다.
-- 혹자는 MSSQL이 대소문자 구분을 하지 않아 이상한 DB라는 분이 계시는데,
이건 MSSQL 특성을 전혀 모르고 하는 이야기이죠. -_- 설정값을 바꾸면 되는데 말이죠.
3. AS : 악센트(성조)에 대한 구분입니다.
- AI : Accent Insensitive – 악센트를 구분하지 않습니다.
- AS : Accent Sensitive – 악센트를 구분합니다.
이것을 구분할 경우 'a'와 'ấ'는 서로 다르게 인식합니다.
중국어에도 성조가 있듯, 언어의 높낮이를 구분할 경우 AI가 아닌 AS를 사용합니다.
4. KI : 일본어 가나 구분입니다.
- KI : Kana Insensitive – 가나를 구분하지 않습니다.
- KS : Kana Sensitive – 가나를 구분합니다.
새삼 일본의 위력(?)을 느끼게 하네요. 가나구분이라니요.
가나란 영어/라틴의 대/소문자 구분과 비슷한 히라가나와 가타가나를 구분함을 의미합니다.
あいうえお 와 アイウエオ를 각각 다른단어로 인식할 지 여부를 결정하는 것이죠.
… 일본어의 히라가나/가타가나에 대한 상세한 설명은 패스합니다.
5. WS : 전자/반자 구분입니다.
- WI : Width Insensitive – 전자/반자 구분을 하지 않습니다.
- WS : Width Sensitive – 전자/반자를 구분합니다.
전자와 반자는 같은 글자라도 2Byte를 차지하는 전자인지, 1Byte를 차지하는 반자인지 구분해 준다는 거죠.
예를 들어 보겠습니다.
DECLARE @A NVARCHAR(10)
DECLARE @B NVARCHAR(10)
SET @A = N'01234567890'
SET @B = N'01234567890'
SELECT CASE WHEN @A = @B THEN '=' ELSE '<>' END
è 결과는 “=”으로 같다고 나옵니다.
물론 설정하지 않을 경우 Default가 WI이기 때문입니다.
l 어느 사이트에 보면 한자의 전자와 반자, 간체 구분 등으로 설명하는데, 조금 슬프네요.-_-
MSSQL 한글버젼의 경우 기본값은 Korean_Wansung_CI_AS 입니다.
즉, “한글완성형_대/소문자구분안함_악센트구분함”인데요.
우리나라 고어의 경우엔 성조가 있었으나, 현재는 사실상 성조가 없습니다.
그럼에도 불구하고, AS가 기본값인 것은 아이러니입니다.
만약 DB마다 Collation이 다르면 서로 JOIN이 되지 않아서 일일이 JOIN 시 Collation을 지정해 줘야 하는 등 여러 가지 제약조건이 따르겠죠?
자세한 사항은 아래 내용을 참고하세요.
http://msdn.microsoft.com/ko-kr/library/ms144250.aspx
쓸 때에는 몰랐는데, 써 놓고 나니 이상한 데가 많네요. 좀 고쳤어요. -_-