반응형

해외 서비스를 하기 위해서는 Collation를 변경해야 스트링이 깨지는 현상을 방지할 수 있습니다.


데이터 베이스의 Collation 변경 쿼리는 다음과 같습니다.
1. 다른 사용자가 DB를 사용하고 있는데, 변경되면 안 되기 때문에 SINGLE USER로 변경합니다.
-- SINGLE USER MODE 변경 
ALTER DATABASE
DBNAME_DBF
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

2. collate 변경합니다.
--  Thai_CI_AS로 변경
ALTER DATABASE
DBNAME_DBF
COLLATE
Thai_CI_AS

3. 다시 MULTI USER MODE로 원복합니다
-- MULTI USER MODE
ALTER DATABASE
DBNAME_DBF
SET MULTI_USER 


테이블의 컬럼(char, nvarchar, text형 데이터) COLLATE도 변경해야 데이터가 제대로 입력될 수 있습니다.
테이블 컬럼 변경 쿼리는 다음과 같습니다.
ALTER TABLE
DBTable_TBL
ALTER COLUMN
CharacterName varchar(50)
COLLATE
Thai_CI_AS

그리고 만약 위에 CharacterName가 인덱싱이 되어있다면, 인덱싱을 제거하고 collate작업을 한 후 다시 생성해줘야 합니다.


그리고 주의할 점은 만약에 내가 AAAA_DBF라는 데이터 베이스에서 BBBB_DBF라는 데이터베이스 CCCC_TBL테이블의 데이터를 조회했을 때,
AAAA_DBF데이터베이스 COLLATE과 BBBB_DBF 데이터베이스 COLLATE가 다르다면, CCCC_TBL테이블의 스트링이 깨져서 출력될 수 있습니다.
(BBBB_DBF와 CCCC_TBL테이블의 컬럼은 같은 Collation)
USE [AAAA_DBF]
SELECT * FROM BBBB_DBF.dbo.CCCC_TBL WHERE m_szName = 'พูริคอง';

USE [BBBB_DBF]
SELECT * FROM BBBB_DBF.dbo.CCCC_TBL WHERE m_szName = 'พูริคอง';

이 두가지 조회 쿼리의 결과가 달라질 수 있습니다.
저는 AAAA_DBF가 Korean_Wansung_CI_AS이고,  BBBB_DBF가 Thai_CI_AS일 때, 조회된 m_szName이 ????로 깨져 나왔습니다.
AAAA_DBF를 Thai_CI_AS로 변경해서 해결했습니다.

반응형

+ Recent posts