'오라클문자변경'에 해당되는 글 1건

  1. 2007.10.05 오라클 문자변경

Writed by soya98 -- 2005.10.03 월 (soya98@naver.com)

(긁어가지 마시고 " 이 포스트를 내 블로그 담기"로 가져가세요!!

힘들게 정리한것입니다.)


OS       : CentOs

OACLE : 9.2.0.4

STATUS: 디비에 자료가 없는 거의 초기 상태에서 실행했다.


CentOs 에 설치한 오라클(9.2.0.4)이 한글이 깨지고 말썽이다.

인터넷을 돌며 찾아온 매뉴얼대로 했건만 그것도 믿지 못할 것이였으니..

(사실 믿지 못할 것들이다... 문서화된 책이 가장 신뢰감이 있지만 쩝.. 아쉬운대로..)

일단은 다 만든거 다시 깔기도 구찮고 해서 여러가지로 찾아본 결과 다음이 가장

정확한 답이였음을 알수 있었다. 

일단 중요한 데이타는 거의 없고 프로시져가 2개정도 생성되어 있었으면 테이블명 및

데이타 등은 숫자나 영문이였기에 과감히 실행을 했다.


==> 즉 데이타 보전은 확실히 못한다는 무시무시한 경고가 있었다.


(하지만 그렇게 많은 데이타들이 축적되기 전에 이런 문제가 벌써 발생 하지 않았을까 싶다.

이미 한글로 디비를 생성해서 보려고 한다면 한글은 다 깨졌을 것이고 이것은 데이타가 많이

쌓이기전에 즉, 오라클 데이터베이스를 생성한뒤 초기 설정에 해당되는 내용인것 이라고 추측 된다.)


==>바꾸고 보니 프로시저나 펑션에서 주석으로 깨진 한글 그나마 보이긴 하더라.

여전히 "옜옜옜" 과 같은 이해할수 없는 단어 들이였으나 ....

프로시져나 펑션들은 이미 만들어 놓은 것을 갖다가 올리는 것이므로 그다지 크게 문제될 것은 없었다. 또한 테이블의 데이타는 영문,숫자였으므로 그다지 변화가 없었다.)


다음은 서머리 내용!!


단.. 문제는 펑션이나 프로시져에 한글로된 주석이 있으면 한글표현은 되나 깨져서 보인다.

즉, 다시 올리고 나서 컴파일일 해줄것!!

( 위의 내용으로 추측가능한 것은 만약 테이블명이나 컬럼명 혹은 속에 있는 데이타가

한글이라면 아래의 내용을 실행하기 전에 반드시 해당데이타 등을 백업을 해주자. )



1. 오라클에서 한글이

??? 혹은 ¿¿ 식으로 깨지고 있었다.


예를 들면


SQL> select * from scott.emp;
select * from scott.emp
                    *
1행에 오류:
ORA-00942: ¿¿¿ ¿¿ ¿¿ ¿¿¿¿ ¿¿¿¿


2. 해당 메세지에 대해 찾아본 결과

Oracle 데이터베이스 생성시에 Character Set를 기본값으로 설정하게 되면 WE8DEC 로 설정

된다고 한다.!! 이런.. 메뉴얼에선 그냥 선택 하라고 했던게 화근이다.


토드 같은 툴로

desc props$ 를 입력한뒤 data 를 조회해 보자(보기가 깔끔해서 추천!!)

(혹은  sqlplus 나 ssh 같은 툴로

SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';

=>system ,sysdba 계정으로 조회가 가능하다.

혹은

select * from props$ where name='NLS_CHARACTERSET';

=>sysdba 계정으로만 조회가 가능하다.)


조회를 해보면 (그중 고쳐야 할 부분만 추려낸것이다.)

NAME                        VALUE$          COMMENT$

NLS_CHARACTERSET WE8ISO8859P1 Character set

와 같이 설정되어 있다.

제대로된 설정이라면(내가 원하는 제대로된 설정은 한글과 영문이

말그래도 "제대로" 보여지는 것이다.)

즉, VALUE$ 컬럼에 있는 값이 KO16KSC5601 혹은 KO16MSWIN949 이였어야 한다.

(보통은 KO16MSWIN949 을 많이 추천함

@_@ 참고 good!! KO16MSWIN949에 대해 설명이 쉽게 잘되있삼

http://cafe.naver.com/ramiyan.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=268

)


3. 이제는 바꾸어 보자!  WE8ISO8859P1 --> KO16KSC5601

(어짜피 한글사용을 하더라도 정확한 어법에 맞는것만 사용할것이기 때문에 

KO16KSC5601 를 선택했다.)


일단은  SSH 툴로 리눅스(CentOs) 에 원격 접속했다.(집에서 하느라 ㅡㅡ;;)


sqlplus "/as sysdba"


로 접속한다. 일단 디비를 셧다운 시킨뒤 마운트 상태에서 필요한 셋팅을 해주고

다시 디비를 구동한 다음에 캐릭셋을 변경하고 다시 셧다운 시킨뒤 스타트업으로 완전히

실행하는 방식이다. 아래와 같이 실행해 주자.


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 internal_use KO16KSC5601;
SQL> SHUTDOWN IMMEDIATE; -- or NORMAL
SQL> STARTUP;


한글 캐릭셋

KO16MSWIN949
KO16KSC5601


유럽문자 지원 캐릭셋

WE8ISO8859P1

다른 자료들을 찾아보면

alter database character set internal_use KO16KSC5601;

부분이
ALTER DATABASE CHARACTER SET KO16KSC5601;

와 같이 되어 있다.

아래와 같은 방식으로는 절대 바꿀수가 없다.


ERROR at line 1:
ORA-12712: new character set must be a superset of old character set

와 같은 메세지가 뜬다. 이것은

"새로운 캐릭터셋은 반드시 기존 캐릭터셋의 Superset이어야만 한다"

는 의미로 해석이 된다.아래 블로그에서 유용한 자료를 찾았다.

 이렇게 하지 않으면 데이타가 보존이 되지 않는다고 한다.

(http://cafe.naver.com/mudong.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=548

의 캐릭터셋 변경의 실제 부분참고)

4. 자 이제 제대로 됬나 확인해보자

다음과 같이 아무렇게나 에러메세지를 발생해보자

(우리의 주특기 아닌가??)


SQL> select * from scott.emp;
select * from scott.emp
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다


desc props$ 도 다시 해보자. 2번의 sql을 다시 해보자~

Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요