어느 가을날의 전환점

ORACLE|서로 다른 캐릭터셋의 ORACLE DB간 DB_LINK 시 한글 호환 방안(편법?) 본문

Database/Oracle

ORACLE|서로 다른 캐릭터셋의 ORACLE DB간 DB_LINK 시 한글 호환 방안(편법?)

어느가을빛 2011. 9. 7. 15:33
- 이진 전송을 이용한 편법(?)

<< 조회 시 - SELECT >>
  
1. 먼저 오라클은 서버와 클라이언트의 문자셑이 일치하면 문자셑 변환을 시도 하지 않고 문자열의 이진 이미지 그대로를 저장합니다.
이 말이 무엇이냐면 예를 들어 US7ASCII로 설정된 서버와 클라이언트가 있는데... 이때 '썊' 같은 지원되지 않는 문자를 입력해도 ... 잘 입력되고 조회된다는 말입니다.단 위의 님들 말처럼 서버 내부에서는 저 놈을 문자로 안 봅니다.length('썊') 하면 2가 나옵니다.
즉 서버와 클라이언트가 동일한 문자셑을 가지면 그때 입력한 자료는 그놈이 US7ASCII의 문자셑일 때 입력한 자료나 KO16KSC5601 일 때 입력한 자료나 KO16MSWIN949 일 때 입력한 자료나 다 동일한 저장 이미지를 갖는다는 것입니다.생각해 보십시오. 단지 sys.props$의 값만 바꾼다고 문자셑이 바뀌는 이유도 다 이때문이죠.

2. 두대의 서버가 있고 각각의 서버에 접근하는 클라이언트는 각각 서버의 문자셑을 따른다고 가정하면 문제는 서버간의 문자 전송 역시 문자셑변환을 일으키지 않도록 하면 되지 않는가!라는 아이디어 이지요..
방법이 있죠 utl_raw.cast_to_raw를 써서 이진 포맷으로 속이는 겁니다. 마찬가지로 받는 쪽에서는 utl_raw.cast_to_varchar2로 살리구요..

소스 서버에 뷰를 생성 한글 컬럼은 utl_raw.cast_to_raw()함수로 캐스팅하여 이진화하여 보여줌.
타켓 서버에서는 소스 서버의 뷰를 조회하여 한글 컬럼을 utl_raw.cast_to_varchar2()함수로 캐스팅하여 본다.

<< 저장 시 - INSERT >>
 
PROCEDURE를 이용.
 
환경 A DB : KO16KSC5601 
         B DB : US7ASCII
 
원하는 방식 A db  -> B db INSERT
 
1. DBLINK를 만들고
2. B DB에 PROCEDURE 생성
CREATE OR REPLACE PROCEDURE PRO_3 ( AAA IN raw) IS
BEGIN
   tmpVar := 0;
   INSERT INTO NAME1
   SELECT utl_raw.cast_to_varchar2(AAA) FROM dual;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END PRO_3;
 
3. A DB 연결해서 아래 SP 실행
BEGIN
  SENDBILL.PRO_3@DBLINK  ( UTL_RAW.CAST_TO_RAW('대한민국'));
  COMMIT; 
END;


** 올바른 캐릭터셋 선택 방법 **

(1) 한국어만 저장하고 사용할 경우에는 KO16MSWIN949 추천 (KSC5601의 수퍼셋이므로 기존 완성형코드까지 포함함)
 
(2) 한국어를 대부분 사용하지만 일부 타국어(중국어 , 일본어등)을 지원해야할 경우...  KO16MSWIN949 를 기본으로쓰고 National Characterset UTF8(NVARCHAR, NCHAR등을 쓰시기 바랍니다.)
 
(3) 한국어 포함해서 타국어까지 다양하게 섞어쓸 경우...
(이 경우 유니코드 말고는 대안이 없습니다.)


# 참조
2) http://database.sarang.net/?inc=read&aid=37088&criteria=oracle
Comments