1. 개요   

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


2. 방법

데이타베이스의  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 할 수가 없기 때문이다.

2-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-2. 환경 변수 NLS_LANG 을 변경한다.

 .profile 에서

NLS_LANG=American_America.KO16KSC5601; export NLS_LANG

 또는 .cshrc 에서.

setenv NLS_LANG American_America.KO16KSC5601

*** 클라이언트에서는 registry editor에서 NLS_LANG 값을 맞추어준다.


3. 주의

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

3-1.

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

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

3-2.

KO16KSC5601과 US7ASCII를 비교해 보자.

3-2-1. 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

3-2-2. 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 함수와 모두 동일하다. substr, substrb 함수도 위의 length, lengthb의 관계와 같다.