Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-07
제목 NLS CHARACTER SET 변경 방법 (ORACLE 7)
NLS CHARACTER SET 변경 방법 (ORACLE 7)
======================================

PURPOSE
--------

이 자료는 Oracle RDBMS SERVER에서 NLS CHARACTER SET 변경 방법에 대한
내용을 소개한다.


[ ORACLE 7 에서만 가능 ]

데이타베이스의 CHARACTER SET은 데이타 딕셔너리 테이블인 sys.props$에
들어 있다.

SQL>desc sys.props$
Name Null? Type
------------------------- ----------------- ---------------
NAME NOT NULL VARCHAR2(30)
VALUE$ VARCHAR2(2000)
COMMENT$ VARCHAR2(2000)

SQL>column c1 format a30
SQL>select name c1, value$ c1 from sys.props$;

C1 C1
----------------------------- ------------------------
DICT.BASE 2
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_DATE_FORMAT DD-MON-YY
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET US7ASCII
NLS_SORT BINARY
GLOBAL_DB_NAME NLSV7.WORLD

여기서 NLS_CHARACTERSET에 현재 DB의 CHARACTER SET이 들어 있는데
이 값을 변경하여 DB의 CHARACTER SET을 변경할 수 있다.

여기서는 US7ASCII에서 KO16KSC5601로 옮기는 경우를 알아보자.

우선 바꾸고자 하는 CHRACTER SET이 지원되는 지를 다음 명령으로
확인한다.

select convert('a','KO16KSC5601','US7ASCII') from dual;

만약 이 Select 문에서 ORA-01482 에러가 발생하면 지정한 CHARACTER
SET이 지원되지 않는 경우이며 에러가 발생하지 않으면 CHARACTER
SET을 변경할 수 있다.

작업을 하기 전에는 만약을 위해서 DB 전체를 백업 받아두도록 한다.
CHARACTER SET 을 잘못 변경하면 DB 를 OPEN 할 수가 없기 때문이다.
--------------------------------------------------------------
1. 다음의 Update문을 실행하여 CHARACTER SET을 변경한다.

UPDATE sys.props$
SET value$ = 'KO16KSC5601'
WHERE name = 'NLS_CHARACTERSET';

Update 시에 NLS_CHARACTERSET을 지원되지 않는 값으로 잘못 설정하거나
실수로 콘트롤 문자 같은 것이 들어가게 되면 DB가 Shutdown 된 다음에는
Startup 이 안되므로 Update 후에 다음 명령으로 확인을 한 다음에
Commit을 하도록 한다.

select name, value$
from sys.props$
where value$ = 'KO16KSC5601';

Select가 제대로 출력되면 Commit 하고 Shutdown 했다가 Startup 하게
되면 새로운 CHARACTER SET 값을 갖게 된다. SELECT가 안 되면 ROLLBACK
하고 UPDATE부터 다시 하도록 한다.


2. 환경 변수 NLS_LANG 을 변경한다.

.profile 에서

NLS_LANG=American_America.KO16KSC5601; export NLS_LANG

또는 .cshrc 에서.

setenv NLS_LANG American_America.KO16KSC5601

*** win95 및 winnt의 client에서는 registry editor에서 NLS_LANG 값을
맞추어준다.



주의 !!!

: 위의 작업을 하기 전에 발생할 가능성이 있는 문제점

1) update 중 KO16KSC5601 이나 US7ASCII 등에서 철자를 잘못 입력하시면,
db 재기동 후에, 다음과 같은 에러가 발생합니다.

ora-12708
12708, 00000, "error while loading create database NLS parameter %s"


2) KO16KSC5601과 US7ASCII의 비교

Character set : KO16KSC5601 인 경우
===================================
: double byte encoding schema 이므로, 한글의 경우 2 bytes 를 크기 1로
계산하는 함수들이 있습니다.
그리고, table , column name에 한글을 double quote 없이 사용할 수 있습니다.

예)
SQL> create table 시험1
2 (컬럼1 varchar(10));

a
홍길동

SQL> select length(컬럼1) from 시험1;
1
1
3

SQL> select lengthb(컬럼1) from 시험1;
2
1
6

Character set : US7ASCII 인 경우
=================================
: single byte 7 bit encoding 을 사용합니다.
한글로 된 table, column 이름 사용 시 double quote를 반드시 사용해야 한다.

예)
SQL> create table "사원"
2 ("사원이름" varchar2(10));

a
홍길동

SQL> select length("사원이름") from "사원";
2
1
6

SQL> select lengthb("사원이름") from "사원";
2
1
6

US7ASCII일 때에는 vsize, lengthb function의 결과가 length 함수와 모두
동일합니다.

cf) substr, substrb 함수도 위의 length, lengthb의 관계와 같음.


출처 : Technical Bulletin (Korean)
Comment
등록된 코멘트가 없습니다.