Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-14
제목 환경 변수들이 모두 올바른 데도 character set 에 문제가 있는 경우
환경 변수들이 모두 올바른 데도 character set 에 문제가 있는 경우
=============================================================

Oracle version 7.2 에서부터 사용되는 환경변수인 ORA_NLS 를 잘못 setting
하면, 다음과 같은 character set 문제가 발생할 수 있습니다.

server version 환경변수
============== =========
7.2 ORA_NLS
7.3 ORA_NLS32
8.0 ORA_NLS33
9i ORA_NLS33
10G ORA_NLS10
11G ORA_NLS10


즉, 다음의 경우에 위처럼 환경 변수 ORA_NLS 가 DB version 과 일치하는
지를 확인해야 합니다.

1) US7ASCII 에서 KO16KSC5601 로 character set 을 변경하기 전에
변경이 되는지 확인하는 조회에서 다음과 같은 에러 발생하는 경우

select convert('a','KO16KSC5601','US7ASCII') from dual;
Ora-1482 "unsupported character set"

2) props$, v$nls_parameters 의 character set 이 서로 다른 값을
가질 경우

3) v$nls_valid_values 에 default value 만 조회되는 경우
(즉, select count(*) from v$nls_valid_values; 의 결과가
4 인 경우 ORA_NLS 가 setting 되어 있지 않기 때문)

4) table 생성시에 ora-911 "invalid character",
ora-904 "invalid column name" 빌생하는 경우

5) NLS_LANG 을 올바로 setting 하였는 데도, 한글이 ??? 로 나오는 경우


$ env | grep ORA_NLS
ORA_NLS=$ORACLE_HOME/ocommon/nls/admin/data

$ cd $ORA_NLS
ls -l boot
-rw-r--r-- 1 rctest72 dba 13572 Dec 2 1995 lx0boot.d
-rw-r--r-- 1 rctest72 dba 13572 Dec 2 1995 lx1boot.d

이 두개의 화일이 ORA_NLS 디렉토리에 있어야 합니다.
(version 에 따라 size 는 다를 수 있습니다.)

해결 방법
========
만약,ORA_NLS(ORA_NLS32,ORA_NLS33) 이 setting 되지 않았거나,rdbms version
과 맞지 않을 경우 다시 수정한 후에 restartup 하면 이와 관련된 문제는
해결됩니다.
(특정 OS, Ticom 의 경우 OS 를 rebooting 해야 하는 경우도 있습니다.)

해결 방법은 ORA_NLS 를 정상적으로 setting 한 후에 restartup 하면,
v$nls_valid_values 에 KO16KSC5601 이 조회되었고, 한글 테이블명이나
컬럼명이 가능해지고, dictionary 도 KO16KSC5601 로 일치하게 됩니다.


다음의 CASE1, CASE2 를 통해 이 환경 변수가 DB 에 미치는 영향을
확인할 수 있습니다.

CASE1
=====

위의 lx0boot.d, lx1boot.d 화일을 ACCESS 할 수 있을 때, 기동된 instance 의
dictionary를 조회하면, 많이 사용하는 KO16KSC5601, US7ASCII 등의 character
set 을 조회할 수 있습니다.

SQLDBA> select * from v$nls_valid_values;
...

313 rows selected.

SQLDBA> select * from v$nls_valid_values where value='KO16KSC5601';
PARAMETER VALUE
-------------------------------------------- ---------------
CHARACTERSET KO16KSC5601

1 row selected.
; 즉, total 313 row 가 있고 그 중에 KO16KSC5601,US7ASCII 도 있음


CASE2
=====
그러나, lx0boot.d, lx1boot.d 화일을 ACCESS 할 수 없을 때, 기동된
instance 의 dictionary 를 조회하면, default value 들만 조회됩니다.

SQLDBA> select * from v$nls_valid_values;
PARAMETER VALUE
-------------------------------------------- ---------------
LANGUAGE AMERICAN

TERRITORY AMERICA

CHARACTERSET US7ASCII

SORT BINARY

4 rows selected.
;즉, lx0boot.d, lx1boot.d 를 access 할 수 없을 경우에는 위의 US7ASCII 만
지원합니다.
Comment
등록된 코멘트가 없습니다.