COLLATION : 데이터정렬
COLLATION은 문자열의 정렬 순서를 결정하는 중요한 녀석이다. 5개의 항목으로 나눠지는데 세부항목을 따져볼 필요가 있다.
1. 언어 설정
- Korean_Wansung : 한국어
- Latin1_General : 영어
- Chinese_PRC : 중국어
- Japanese : 일본어
- ...
2. 대, 소문자 구분
- CI(CASE Insensitive) : 대, 소문자 구분하지 않음
- CS(CASE Sensitive) : 대, 소문자 구분
ex) STRING = string -> CI 면 TRUE CS 면 FALSE
3. 악센트 구분
- AI(Accent Insensitive) : 악센트 구분하지 않음
- AS(Accent Sensitive : 악센트 구분
ex a = ấ -> AI 면 TRUE AS 면 FALSE
4. 히라, 가타가나 구분
- KI(Kana Insensitive) : 일본어 히라, 가타가나 구분하지 않음 (defalut)
- KS(Kana Sensitive) : 일본어 히라, 가타가나 구분
ex アエイオウ = あえいおう -> KI 면 TRUE KS 면 FALSE
5. 전, 반자 구분
- WI(Width Insensitive) : 전, 반자 구분하지 않음 (defalut)
- WS(Width Sensitive) : 전, 반자 구분
ex) A -> WI 면 2Byte WS 면 1Byte
일본어 COLLATION의 Japanese_CI_AS_KS_WS 를 분석해보면
일본어 + 대, 소문자 구분안함 + 악센트 구분 + 가나 구분 + 전, 반자 구분
의 조합으로 이루어 졌음을 알 수 있다.
DEFAULT COLLATION은 설치된 윈도우의 영향을 받는다. 한국 윈도우 설치 시 Korean_Wansung_CI_AS 고 영문 윈도우 설치 시 Latin1_General_CI_AS 이 DEFAULT COLLATION이다.
COLLATION 문제를 만날 수 있는 경우 테스트
아래와 같이 테이블 2개를 생성하면서 한 테이블은 데이터베이스 기본 값 다른 데이터베이스는 COLLATION 지정
USE TEST
GO
-- 테이블생성
CREATE TABLE dbo.Collation1
(
Col1 VARCHAR(10)
, Col2 INT
)
GO
CREATE TABLE dbo.Collation2
(
Col1 VARCHAR(10) COLLATE Japanese_CI_AS_KS_WS
, Col2 INT
)
GO
-- 데이터삽입
INSERT INTO dbo.Collation1
SELECT 'A', 1
UNION ALL SELECT 'B', 2
UNION ALL SELECT 'C', 3
GO
INSERT INTO dbo.Collation2
SELECT 'A', 11
UNION ALL SELECT 'B', 22
UNION ALL SELECT 'C', 33
GO
--*/--
-- COLLATION Error
SELECT *
FROM dbo.Collation1 AS a
JOIN dbo.Collation2 AS b
ON a.Col1 = b.Col1
COLLATION이 다른 컬럼을 이용하여 조인 시 <그림1>과 같은 에러를 보이며 실행되지 않는다.
-- DATABASE_DEFAULT
SELECT *
FROM dbo.Collation1 AS a
JOIN dbo.Collation2 AS b
ON a.Col1 = b.Col1 COLLATE DATABASE_DEFAULT
Column의 COLLATION이 데이터베이스의 COLLATION과 다른 것을 DATABASE_DEFAULT로 설정하고 실행하면 <그림2>에서 보는 것과 같이 문제없이 실행된다 .
-- ALTER COLLATION
ALTER TABLE Collation2 ALTER COLUMN Col1 VARCHAR(10) COLLATE Korean_Wansung_CI_AS
SELECT *
FROM dbo.Collation1 AS a
JOIN dbo.Collation2 AS b
ON a.Col1 = b.Col1
Column의 COLLATION이 데이터베이스의 COLLATION과 다른 것을 DATABASE 설정과 같게 설정하고 실행하면 <그림3>에서 보는 것과 같이 문제없이 실행된다.
--*/--
COLLATION 확인명령어
1. SERVER : SELECT SERVERPROPERTY(N'COLLATION') AS COLLATION
2. DATABASE : EXEC sp_helpdb TEST
(실행 결과가 너무 길어 전체를 보여주기 위해 3줄로 잘랐다.)
3. COLUMN : EXEC sp_help Collation1
COLLATION 변경 명령어
1. SERVER : Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts /[ SAPWD= StrongPassword ] /SQLCOLLATION=CollationName
-> MSDN
-> 자세한 사항 확인
확인사항
- 사용자 데이터베이스 백업
2. DATABASE : ALTER DATABASE TEST COLLATE Latin1_General_CI_AS
확인사항
- 변경하려는 데이터베이스를 사용 중인 세션
3. COLUMN : ALTER TABLE Collation1 ALTER COLUMN Col1 VARCHAR(10) COLLATE Latin1_General_CI_AS
확인사항
- 계산된 열
- 인덱스
- 자동으로 또는 CREATE STATISTICS 문에 의해 생성된 배포 통계
- CHECK 제약 조건
- FOREIGN KEY 제약 조건
ps1.
20120405 2 Collation Error 테스트.sql
'SQL Server' 카테고리의 다른 글
unable to begin a distributed transaction (0) | 2012.07.24 |
---|---|
Index Rebuild (0) | 2012.07.19 |
2008 서버에서 성능데이터 SQL Server로 수집하기 (0) | 2012.05.21 |
MySQL DBLink (0) | 2012.04.05 |
동적쿼리 제대로 알고 활용하자. (0) | 2012.03.28 |