BigData

오라클 Charset 변경 해야 하는 이유와 방법

IT오이시이 2014. 4. 11. 15:54
728x90

[CHARACTER SET 변경 왜 하나 ?]

많은 글들이 이런 문제를 해결 하는 방법을 소개 하고 있다.

하지만 왜 하는가 ? 이다. 이 것은 2000년대 중반 포털 싸이트에서 오라클을 이용하게 되면서 이슈화 된것이다.

일반적으로 우리가 쓰는 한글에는 큰문제가 없었기 때문에 금융권이나 정부에서는 큰문제가 되지 않았다.

하지만 게시판글에  쀩 뿛 홁 같은 특수한 한글 문자 들을 쓰게 되면서 DB에 들어간 문자가 깨지기 시작했다.


그러나 다시 10년이 지난 2014년 이 되면서 아래와 같은 MS949 (cp949:code page 949) 만으로는 부족하게 되었다.

모바일 시장이 글로벌로 진출하게 되면서 국내 기업들이 해외로 진출하게 된다. 이때 가장 문제 되는 것이 

Charset와 time에 대한 문제이다.


[국제화를 위한 준비가 필요한 시점이다. ( NVARCHAR와 TIMESTAMP) ]

현재 우리는 오라클 기준 char와 varchar2를 사용하고 있어 각 나라의 데이터를 입력 하더라도 

하나의 테이블에 다른 나라의 문자를 수용하기 힘들어 졌다. 단순히 UTF8을 쓴다하더라도 이 문제는 계속 불거질 것이다.

이것의 대안으로 NCHAR, NVARCHAR2을 오라클은 내놓았다. 

그리고 DATE 형도 마찬가지다. 날짜 값을 기준으로  2014.04.13 14시 13분은 각 나라별 다른 시간과 날짜로 이해 된다.

같은 값이라도 시차를 적용한 값이 필요하다는 것이다. 이를 위해 TIMESTAMP를 사용하도록 하고 있다는 것은 알아 두기 바란다.


우선 오늘은 DB의 Charset을 변경하는 것이므로  본론으로 들어 가보면 해야 할 일들은 아래와 같다.

[Charset  종류별 변경 체크 사항 ]

오라클 데이터베이스에 Charset 은 주로 KO16KSC5601 , KO16MSWIN949, AL32UTF8 를 사용한다.

물론 Charset만 수정한다고 한국어가 중국어로 저장되지 않는다. 그리고 한글 완성형 조합형 등 종류도 많지만

왜 하는 가를 고민하고 정리를 하면 좋겠다.

Character Set은 각 나라 특히 한.중.일 은 영어 ASCII 영역 뒤이 추가적인 바이트를 추가하는 방식으로 확장 해서 사용한다.

주로 한글은 2바이트, UTF8은 3바이트를 가진다고 한다.

그리고 각 charset은 같은 ascii 문자로 구성하더라도 다른 값을 가르키거나 없을수 있기 때문에 "?" 가 나온다고 이해 하면된다.

오라클에서 charset의 커버리지은  다음과 같은 포함 관계를 가진다.

    US7ASCII < KO16KSC5601 < KO16MSWIN949 < UTF8

 즉 반대로 Charset을 바꾸면 문자 소실이 발생한다는 것이다.

** 주의 할점은   KO16KSC5601에서 KO16MSWIN949 로 전환은 가능하지만 반대로 하는 경우  데이터 일부가 소실된다는 점이다.

    예를 들면 똠 톩  뷣   뿛  과 같은 문자들은 MSWIN949에서 사용 되는 확장된 한글 이다.

    이는 기존 KSC5601 에서는 지원 되지 않아  "?" 또는 깨지는 상태로 저장이 된다.

현재  캐릭터셋

변경 할 캐릭터셋 변경 가능 여부
US7ASCII

KO16KSC5601/KO16MSWIN949/UTF8/AL32UTF8

가능
KO16KSC5601 KO16MSWIN949 가능
KO16MSWIN949 UTF8,KO16KSC5601,US7ASCII 손실 가능

UTF8

 AL32UTF8 가능


[오라클  딕셔너리 변경 방법]

* 와우 고작 아래 몇줄 할려구 서론이 길었다.

* 하지만 왜하는가를 이해 하면 안되는 것이 무엇인지 찾는지도 빠를 것이다.

* 오라클 Charset 의 변경은 다음과 같은 작업을 통해서 재구동이 필요하다.


   SQL> SELECT * FROM nls_database_parameters WHERE parameter =  'NLS_CHARACTERSET';

            PARAMETER                      VALUE

            ------------------------------ ------------------------------

           NLS_CHARACTERSET               WE8MSWIN1252


  • SQL> SHUTDOWN IMMEDIATE;
  • SQL> STARTUP MOUNT;
  • SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
  • SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
  • SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
  • SQL> ALTER DATABASE OPEN;
  • SQL> ALTER DATABASE CHARACTER SET KO16MSWIN949;
  • SQL> SHUTDOWN IMMEDIATE 
  • SQL> STARTUP
  • SQL> SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'
             PARAMETER                      VALUE
             ------------------------------ ------------------------------
             NLS_CHARACTERSET               KO16MSWIN949


이상 끝...




728x90
반응형

'BigData' 카테고리의 다른 글

[ElasticSearch] Query DSL  (0) 2014.10.13
[ElasticSearch] - aggregration query  (0) 2014.10.13
fluentd + elasticsearch 설치 하기  (0) 2014.09.24
install ElastSearch  (0) 2014.09.03
ORACLE heterogeneous connection 란  (0) 2014.03.07
Postgres & enterprise DB 설치 따라하기  (0) 2014.03.07
[ShellScripts ] Mysql RPM 다운로드  (0) 2013.09.23