[LocalDB] SQL2012 LocalDB의 Collation 문제 해결
MSSQL 2012의 LocalDB 사용 중 Join, Where명령에 대해서 아래와 같은 오류가 발생했다.
Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS" and "Korean_Wansung_CS_AS" in the equal to operation.
데이터베이스의 데이터정렬 형식이 서로 맞지 않아서 작업을 수행할 수 없다는 메시지이다.
왜 이러한 현상이 나타났는가?
MSSQL 2012 LocalDB 인스턴스는 기본적으로 'SQL_Latin1_General_CP1_CI_AS' 형식으로 셋팅되며 이를 변경할 수 없다.
...
The instance collation for LocalDB is set to SQL_Latin1_General_CP1_CI_AS and cannot be changed. Database-level, column-level, and expression-level collations are supported normally. Contained databases follow the metadata and tempdb collations rules defined by Contained Database Collations.
....
그래서 LocalDB에 데이터베이스를 생성 할 때에 옵션의 데이터정렬값을 설정해 주지 않으면 기본값인 SQL_Latin1_General_CP1_CI_AS 로 설정된다.
이 데이터정렬셋은 한글 데이터가 들어오면 ???? 과 같이 깨져서 들어오고 제대로 처리를 해주지 못한다.
데이터베이스에서 한글을 쓰려면 데이터베이스 생성시 Korean_Wansung_CS_AS 등으로 선택해 주어야 한다.
물론 데이터베이스가 생성된 이후에도 데이터정렬값을 바꿔줄 수는 있는데, 그 전에 생성한 테이블의 컬럼값들 중 string형(nVarchar, varchar 등) 컬럼들은 여전히 SQL_Latin1_General_CP1_CI_AS 로 설정되어 있고, 데이터정렬 설정 이후에 만들어진 테이블, 컬럼에만 Korean_Wansung_CS_AS 이 적용된다.
이 포스팅에서는 이미 SQL_Latin1_General_CP1_CI_AS 로 만들어진 테이블과 컬럼의 Collation 설정을 변경하는 방법을 알아본다.
sp_help TABLENAME
테이블의 정보를 조회할 수 있다. 두번째 결과테이블에 Column리스트업되고 Collation값을 확인할 수 있다.
숫자형 컬럼은 NULL 이고 문자열타입 컬럼에만 현재 Collation값이 보여진다.
이제 변경할 컬럼을 찾았으니 값을 변경해 준다.
ALTER TABLE T_TYPE ALTER COLUMN 유형명 NVARCHAR(800) COLLATE Korean_Wansung_CI_AS; ALTER TABLE T_TYPE ALTER COLUMN 유형텍스트 NVARCHAR(1000) COLLATE Korean_Wansung_CI_AS; ALTER TABLE T_TYPE ALTER COLUMN USE_YN NVARCHAR(5) COLLATE Korean_Wansung_CI_AS;
Collation이 잘못 들어간 다른 테이블의 컬럼도 모두 찾아서 위와 같은 방법으로 바꿔준다.
물론 데이터베이스를 생성할 때 미리 Collation값을 지정해 줬다면 위와 같이 번거로운 작업을 하지 않아도 된다.
'MS-SQL' 카테고리의 다른 글
[ACCESS] Round 함수의 결과값 반환에 대한 이해. (0) | 2013.07.12 |
---|---|
[ACCESS] 엑세스의 Round 함수의 버그? 오작동 사례. (0) | 2013.07.04 |
써보면 편리한 MSSQL Split 함수 세 개. (3) | 2012.12.29 |
MS-SQL Server 2012 – LocalDB를 사용해보자. (ADO Connection) (0) | 2012.11.03 |
오류 : 사용자 'sa'의 계정이 현재 잠겨 있으므로 로그인하지 못했습니다. 시스템 관리자가 잠금을 해제할 수 있습니다. (0) | 2011.12.29 |