[DB] SQL SERVER

[MSSQL] DATABASE Collation 변경하기

mewoni 2024. 11. 18. 12:48
반응형

COLLATION 확인

Collation 종류 보기

SELECT * FROM ::fn_helpcollations()

 

--DB Collation
SELECT SERVERPROPERTY('collation')
 
--DB Collation List
SELECT name, collation_name FROM sys.databases;

--Column Collation List
SELECT name, collation_name FROM sys.columns

 

COLLATION 변경

--DB Collation 변경
ALTER DATABASE CollateDb 
	COLLATE Korean_Wansung_CI_AI 
GO 

--Table Column Collation 이 다를 경우
--"칼럼 'xxx'는 데이터베이스 데이타 정렬에 종속되어 있습니다." 라는 메시지 발생 가능

--Table Column Collation 변경
ALTER TABLE 테이블명
ALTER COLUMN 칼럼명 VARCHAR(50) COLLATE Korean_Wansung_CI_AI 
GO

인덱스, CHECK 제약조건, Foreign Key 제약조건, 계산된열 등의 Column은 변경 불가 

따라서 PK 제거 -> Collation 변경 -> PK 재생성 으로 처리

 

COLLATION이 다를 경우 오류

- 두 테이블간 Collation 이 맞지 않을 때 발생 ( 예: DB1 과 TempDB 안의 테이블간의 조인시 Collation 이 틀려 발생한 에러 )

equal to 작업에서의 "Korean_Wansung_CI_AS"과(와) "SQL_Latin1_General_CP1_CI_AS" 간의 데이터 정렬 충돌을 해결할 수 없습니다.

 

조회 시 수동으로 COLLATION 지정

CASE 1) 단순 조회 시 조건문에서 수동으로 지정

SELECT 1
FROM TABLE A
JOIN TABLE B
ON A.COL = B.COL COLLATE KOREAN_WANSUNG_CS_AS_WS

 

CASE 2) 함수 또는 프로시저 등의 오브젝트에서 값을 여러번 조회해야 하는 경우 TEMP TABLE을 통해 컬럼에 직접 지정

Create Table #TMP_TBL_EXCEL_ERR
( 
      EXCEL_ROW           INT
    , COL_1     VARCHAR(100)  COLLATE Korean_Wansung_CI_AS
    , COL_2     VARCHAR(100)  COLLATE Korean_Wansung_CI_AS
    , COL_3     VARCHAR(100)  COLLATE Korean_Wansung_CI_AS
    , COL_4     VARCHAR(100)  COLLATE Korean_Wansung_CI_AS
    , PRIMARY KEY (EXCEL_ROW) 
)

 

반응형