본문 바로가기

Sumer

MS SQL 의 데이터에 대한 대소문자 구분

우리는 DataBase에 대한 데이터 조회를 할때 보통 'MY','my'는 같은 결과 로 조회 된다는걸 알고 있습니다.
하지만 이런 방식의 데이터 다루기가 문제가 발생 한다는 것을 깨닭았습니다.
가령 애플리케이션 상의 사용자 ID가 있고 사용자를 ID를 통해 인증 한다고 하십다.
그런데 업체의 요구 사항이 대소문자가 틀리면 다른 사용자라고 간주 해달라고 했습니다.
C# 이나 C++등 애플리케이션 측의 구현에서는 전혀 문제 될게 없는 요구 사항입니다.
하지만 사용자의 ID가 User 테이블의 UserID 라는 PRIMARY KEY 로 설정 되어 있다면 애플리케이션에 심각한 문제 가 됩니다.
사용자는 'MY' UserID를 가지는 사용자를 등록 하고 그후 'my' UserID 를 가지는 사용자를 생성 할려고 할때 DB는 PRIMAry KEY 충돌로 예외를 발생 시킬 것 이기 때문입니다.
이 문제는 MS SQL DataBase 최초 설치시 설정한 문자셋(character set) 설정이 Korean_Wansung_CI_AS 설정 되었기 때문입니다.
여기서 Korean 은 한글을 나타내며, Wansung 는 정렬 규칙(완성형)을 타나냅니다.
CI 는 case-insensitive  의 약자로 즉 대소문(case)를 구분 하지 않겠다는 것 입니다.
AS 는 accent-insensitive 를 나타 내며 액센트를 구분 하지 않는다 뜻 입니다.(한글에서는 별 의미 없습니다.)
위와 같이 초기에 설치 한 문자셋이 대소문을 구분 하지 않는다는 것 이였고 이 결정은 설치시 모든 테이블과 컬럼에 적용이 됩니다.
SQL Server 7.0 까지만 해도 문자셋은 전체 DB에 영향을 끼쳤으며, 그로 인해 문자셋을 바꾸는 작업이 테이블이나 칼럼 단위로 지정 되지 못했으며, 변경 자체도 상당히 까다로웠습니다.
하지만 MS SQL 7.0 이후 부터는 문자셋 설정이 컬럼 단위로 설정 가능하도록 되었고 우리는 이기능을 사용하면
대소문 구분으로 인한 애플리케이션의 문제를 해결 할 수 있을것 입니다.

alter table [table_name] alter column [agent_id] varchar(16) collate Korean_Wansung_CS_AS

위와 같은 Alter Table 문으로 해당 컬럼에 대한 문자셋 을 변경 할 수 있으며 위의 문자셋은 해당 컬럼에 대해 CS(case-sensitive)를 활성화 함으로 MY 와 my 는 개별적 데이터 로 생성 될 수 있습니다.
물론 조회 시도 MY 와 my는 완전히 틀린 데이터로 취급이 되기 때문에 변경후 해당 컬럼의 사용에 대한 각별한 주의 가 필요 합니다.

'Sumer' 카테고리의 다른 글

녹색 성장과 소프트웨어  (0) 2008.09.05
개발자가 비행기 만드는 법  (1) 2008.08.28