본문 바로가기
오라클
2012.01.13 11:03

NLS Parameter 관련 팁

다물칸 주소복사
조회 수 7690 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
구분 팁&트릭

NLS_LANGUAGE 정보 조회 방법

  • SELECT PARAMETER , VALUE FROM V$NLS_PARAMETERS;

NLS_LANGUAGE 변경 방법

  • 오라클의 NLS_LANGUAGE 는 클라이언트의 세션값에 따라 결정 된다 즉, 서버설정값이 아닌 클라이언트의 세션에 의해 결졍되므로(레지스트리의값) 만약 NLS_LANGUAGE 타입이 일치하지 않을 경우(서버의 NLS_LANGUAGE 와 클라이언트의 NLS_LANGUAGE 가 일치하지 않을 경우) 다음과 같이 한글이 등록된다
    • Ex)"GQ1[ 5n7O EW=:F. @T4O4Y"
  • 변경 쿼리
    • update sys.props$ set value$='KOREAN_KOREA.UTF8' where name='NLS_LANGUAGE';
    • COMMIT;

NLS_CHARACTERSET 조회 방법

SELECT * FROM nls_database_parameters
WHERE parameter='NLS_CHARACTERSET' or parameter='NLS_LANGUAGE';

Viewer

NLS_CHARACTERSET 변경 방법 (1)

  • Oracle 계정으로 로그인
    • sqlplus "ID/PASSWORD as sysdba"
  • NLS_CHARACTERSET 변경
    • SHUTDOWN IMMEDIATE;
    • STARTUP MOUNT;
    • ALTER SYSTEM ENABLE RESTRICTED SESSION;
    • ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    • ALTER SYSTEM SET AQ_TM_PROCESSES=0;
    • ALTER DATABASE OPEN;
  • 아래처럼 변경한다. character set 은 KO16MSWIN949 도 사용가능 하다.
    • ALTER DATABASE CHARACTER SET KO16KSC5601;
  • 혹시 superset 이 틀리다는 오류가 나면 아래처럼 강제로 수정할 수 있다.
    • ALTER DATABASE CHARACTER SET INTERNAL_USE KO16KSC5601;
  • 모든 작업이 끝나면 디비를 재시작 해야 한다.
    • SHUTDOWN IMMEDIATE;
    • STARTUP;

NLS_CHARACTERSET 변경 방법 (2)

SHUTDOWN IMMEDIATE; 
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
  • ko16ksc5601
update sys.props$ set value$='KO16KSC5601' where name='NLS_CHARACTERSET'; 
update sys.props$ set value$='KO16KSC5601' where name='NLS_NCHAR_CHARACTERSET'; 
update sys.props$ set value$='AMERICAN_AMERICA.KO16KSC5601' where name='NLS_LANGUAGE';

or

update sys.props$ set value$='KOREAN_KOREA.KO16KSC5601.KO16KSC5601' where  
name='NLS_LANGUAGE';
  • ko16mswin949
update sys.props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET'; 
update sys.props$ set value$='KO16MSWIN949' where name='NLS_NCHAR_CHARACTERSET'; 
update sys.props$ set value$='KOREAN_KOREA.KO16MSWIN949' where name='NLS_LANGUAGE';
  • UTF8
update sys.props$ set value$='UTF8' where name='NLS_CHARACTERSET'; 
update sys.props$ set value$='UTF8' where name='NLS_NCHAR_CHARACTERSET'; 
update sys.props$ set value$='KOREAN_KOREA.UTF8' where name='NLS_LANGUAGE';
commit;
SHUTDOWN IMMEDIATE; 
STARTUP;
  • 확인
select * from v$nls_parameters; 
  • Linux의 경우 설치할 때 지정해 주었던 .bash_profile 파일에서 oracle 언어 환경변수를 아래와 같이 변경
export NLS_LANG = AMERICAN_AMERICA.KO16KSC5601
  • Windows 사용자의 경우 regedit 에서 HKEY_LOCAL_MACHINE -> SOFTWARE -> HOME0 -> NLS_LANG 을 AMERICAN_AMERICA.KO16KSC5601로 수정한 후 재부팅 한다.
  • DB에 한국어만 사용되면 상관이 없는데...다국어 사용시 유용하리라 생각됩니다.


NLS_CHARACTERSET, NLS_NCHAR_CHARACTERSET의 차이?

  • NLS_CHARACTERSET는 char,varchar 같은 데이터 타입에서 사용하는 문자 집합이고, NLS_NCHAR_CHARACTERSET는 nchar, nvarchar 같은 데이터 타입에서 사용하는 문자 집합입니다. NLS_NCHAR_CHARACTERSET는 AL16UTF16를 포함하여 두가지 밖에 없습니다. 일반적으로 주로 사용하는 언어에 대하여 NLS_CHARACTERSET을 지정합니다. 한글과 영어만 사용하실 경우에는 KO16KSC5601, KO16MSWIN949가 있습니다. 한글과 영어를 제외한 언어를 사용하실 경우에는 UTF8과 같은 문자 집합이나, 각 나라 언어에 맞는 문자 집합을 설정하시면 됩니다. 가끔 한글을 사용하시는데 US7ASCII를 설정하시는 경우가 있는데 이것은 한글을 제대로 입력하지 못하기 때문에 자료이전 시에 큰 문제를 야기 시킬수 있습니다. 일반적으로 KO16KSC5601, KO16MSWIN949로 문자 집합을 설정하고, 한글과 영어를 제외한 다른 나라 언어 입력시에는 데이터 타입을 ncahr,nvarchar로 사용하시면 됩니다.
  • 단일 바이트 문자집합에서 각 문자는 1바이트를 차지합니다. 단일 바이트 7비트 인코딩 체계는 최대 128개의 문자를 정의할수 있으며 단일 바이트 8비트 인코딩 체계는 최대 256개의 문자를 정의할 수 있습니다.
   <단일 바이트 체계의 예>
   7비트 문자 집합 : ASCII 7비트 미국 영어(US7ASCII)
   8비트 문자 집합 : ISO 8859-1 서유럽어(WE8ISO8859P1)
                   EBCDIC 코드 페이지 500 8비트 서유럽어(WE8EBCDIC500)
                   DEC 8비트 서유럽어(WE8DEC)
  • 멀티바이트 문자 집합은 문자당 하나 이상의 바이트로 표현되며, 일반적으로 아시아 언어 지원에 사용됩니다. 일부 멀티바이트 인코딩 체계는 MSB(최상위 비트)값을 사용하여 바이트가 단일 바이트를 나타내는지 아니면 문자를 나타내는 일련의 바이트중 일부인지를 나타냅니다. 그러나 다른 문자 인코딩 체계에서는 단일바이트가 멀티바이트 문자와 구별됩니다.
   <멀티 바이트 체계의 예>
   가변 너비 멀티바이트 : 일본어 확장 UNIX코드(JEUC), 중국어 GB2312-80(CGB2312-80), AL32UTF8(UTF-8)
   고정 너비 멀티바이트 : 국가별 문자집합(AL16UTF16), 16비트 유니코드(고정 너비 2바이트 유니코드)


접속툴에서는 잘되는데 프로그램으로 실행하면 한글이 물음표로 나오는 경우

이상하게 클라이언트 접속툴(Golden 32, Toad) 에서는 Insert 시 정상적으로 한글이 입력이 되는데, ASP 페이지를 생성하여 인서트 처리를 하면 한글이 깨지는것이다.

그래서 레지스트리에서 캐릭터셋을

   AMERICAN_AMERICA.US7ASCII
   KOREAN_KOREA.KO16KSC5601
   KOREAN_KOREA.KO16MSWIN949

을 차례대로 바꾸어 봤으나 계속 한글이 ??? 처럼 물음표표시로 나오는 것이다.

문제는 .. 어이가 없게도.. 오라클에 설정된 것이 ODBC , OraOLEDB 설정에 따라서 한글이 깨질수 있다는 것이다.

현재 서버에는 캐릭터셋이 AMERICAN_AMERICA.US7ASCII 으로 되어있으나 아날라이저에서 출력하면 한글이 정상적으로 출력이 되나, KOREAN_KOREA.KO16KSC5601 시리즈로 변경하면 계속 한글이 마구잡이로 깨져출력이 된다. 한글깨짐 현상은 방금 겪은 경험상 캐릭터셋도 연관이 있고, 서버 접속설정이 OraOleDB냐 ODBC 방식에도 밀접한 연관이 있다고 할수있다. 세부적으로 설명하긴 어렵지만, 방금 연결문자열에 Provider=OraOLEDB.Oracle.1; 이 놈을 삭제하니 정상적으로 입,출력이 된다.. 그러니 현재 설정된 DB 는 OraOLEDB 가 아니라는 것이 된다. 연결성공이 문제가 아니다. 연결성공안에 숨어있는 오류를 조심하자.

   ConnectString = "User ID=아이디;Data Source=서비스명; PassWord=비밀번호"
   'Provider=OraOLEDB.Oracle.1;
  • 주인장 덧글: 이런 경우도 있지만 프로세스에서 처리하는 경우 유니코드처리를 하지 않아 물음표표시로 나오는 경우도 있습니다.
  • ?
    다물칸 2014.11.07 16:42
    {SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_LANGUAGE') || '_' ||
    (SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_TERRITORY') || '.' ||
    (SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET')