2013년 8월 21일 수요일

NLS_LANG 정리

NLS_LANG 정리  Oracle 
2011/11/02 19:53
전용뷰어 보기

NLS_LANG 정리 

NLS_LANG =   [언어]_[영역].[캐릭터셋]
             <language>_<Territory>.<client characterset>
    ex) AMERICAN_ARERICA.KO16KSC5601, AMERICAN_AMRRICA.UTF8
  ● <Territory> - 영역정보, 달력 설정 방법, 통화기호(달라), 숫자그룹
                   날짜 포맷(한국 - "05/08/12 오후 07:28:03", 체코 - "10.08.05 19:28:03")
                   Language 값만 설정하면, Language 값을 따른다. ( AMERICAN ==> AMERICA )

  ● <language> - 캐릭터셋, 정렬방식, 날짜 표기에 사용되는 기호(년/월/일, YYYY/MM/DD) 
                  Default 값은 AMERICAN 이다.
                  실제 날짜 표기(TO_CHAR,TO_DATE 실행시 - 월요일, MON 으로 표시를 좌우하는
                  NLS_DATE_FORMAT 값은 NLS_LANGUAGE 을 따른다. [하단.  테스트 1 참조 ]

  ● <client characterset>
    ◇ 기본적으로 Server characterset 과 동일하게 설정된다. 
    - 클라이언트에서 캐릭터셋만 설정하면, 디폴트로 AMERICAN_AMERICA 로 Territory_language 값이 설정된다.
    ◇ Client Characterset 을 Server 와 다르게 설정 상태에서,
      SQL> SELECT SYS_CONTEXT('USERENV','LANGUAGE') "NLS SET" from dual;
      을 실행 하여도, 항상 CharacterSet 은 항상 서버 CharacterSet 값을 가져온다.
    ◇ client characterset을 서버와 다르게 하는 경우는 크게
      1. 다른 캐릭터셋 DB로 데이타 이전시(EXPORT/IMPORT)
         △  EXPORT/IMPORT 시에는 반드시 서버의 Character Set 동일하게 설정 후 Export/Import 한다.
         △  다른 캐릭터셋의 DB(데이타가 깨지지 않고, 지원되는 경우, SubSet Characterset 일경우)로 IMPORT 시에는
           Import 대상의 DB 캐릭터셋으로 환경 설정 후, Export/Import 한다. 
      2. Server(UTF8) - Client(KO16KSC5601)
         △ 다국어 지원되는 데이타베이스에다 한글 입출력 하기 위해서는
            입력시 - 내가 입력 하는 데이타의 캐릭터셋이 한글임을 알리기 위해서,
            출력시 - Unicode 의 Data를 한글로 표현해 달라고 하기 위해서
            지금까지 DB 가 UTF8 이면, Client 도 UTF8 로 설정하면 되는 줄 알았는데. 아니네요 ㅡ_ㅡ;


     ◇ NLS_LANG 지정 방법
     1. SESSION LEVEL
      - 가장 우선 된다.
      - select * from nls_session_parameters 를 통해서 확인 가능
      - 변경 방법1.
      -- 확인
      SQL> select * from nls_session_parameters
           where PARAMETER in  ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');

                  PARAMETER                      VALUE
          ------------------------------ ----------------------------------------
          NLS_LANGUAGE                   AMERICAN
          NLS_TERRITORY                  AMERICA
          NLS_DATE_FORMAT                DD-MON-RR
          NLS_DATE_LANGUAGE              AMERICAN
          NLS_SORT                       BINARY
      SQL> SELECT SYS_CONTEXT('USERENV','LANGUAGE') "NLS SET" from dual;
     
      NLS SET
      --------------------------------------------------------------------------------
      AMERICAN_AMERICA.US7ASCII
         
        -- 변경 
        SQL> ALTER SESSION SET NLS_LANGUAGE='KOREAN';
       
        Session altered.
        -- 변경 확인
        SQL>  select * from nls_session_parameters
        where PARAMETER in  ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');
         
          PARAMETER                      VALUE
          ------------------------------ ----------------------------------------
          NLS_LANGUAGE                   KOREAN
          NLS_TERRITORY                  AMERICA
          NLS_DATE_FORMAT                DD-MON-RR
          NLS_DATE_LANGUAGE              KOREAN
          NLS_SORT                       BINARY

        SQL> SELECT SYS_CONTEXT('USERENV','LANGUAGE') "NLS SET" from dual;
     
        NLS SET
        ---------------------------------------------------------------------------------------
        KOREAN_AMERICA.US7ASCII

      - 변경 방법2.
        UNIX, WINDOWS 에서 NLS_LANG 값을 변경한다.
     ◇ UNIX - export NLS_LANG=American_America.US7ASCII 설정
     ◇ Windows - SET NLS_LANG=American_America.US7ASCII 설정
     ◇ NLS_LANG 잘못 지정시
             NLS_LANG 을 잘못 지정시 sqlplus 실행시 오류 발생 [ I 가 하나 빠짐 ]
             export NLS_LANG=American_America.US7ASCI
             sqlplus scott/tiger
             SQL*Plus: Release 8.1.7.0.0 - Production on Thu Jun 4 18:00:25 2009
             (c) Copyright 2000 Oracle Corporation.  All rights reserved.
             ERROR:
             ORA-12705: invalid or unknown NLS parameter value specified
      -
                    
   2. INSTANCE LEVEL
    - SELECT * FROM NLS_INSTANCE_PARAMETERS ; 를 통해서 확인 가능
    - SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME LIKE '%nls%'; 를 통해서 확인 가능
      [ NLS_INSTANCE_PARAMETER 에서 값을 가져온다. ]

   3. DB LEVEL
    - SELECT * FROM NLS_DATABASE_PARAMETERS ; 를 통해서 확인 가능
    - SELECT NAME, VALUE$ FORM SYS.PROPS$ WHERE NAME LIKE '%NLS%' ; 를 통해서 확인 가능
      [ NLS_DATABASE_PARAMETERS 에서 값을 가져온다. ]
    - SELECT * FROM V$NLS_PARAMETERS 를 통해서 확인 가능      
      [ NLS_DATABASE_PARAMETERS 에서 값을 가져온다. ]   
    -      

[테스트 1]
-- NLS_LANGUAGE 을 변경하고, DATE TYPE 의 데이타를 TO_CHAR 함수를 통해서 조회한다.
-- NLA_LANGUAGE, 엄밀히 말해서 NLS_DATE_LANGUAGE 값이 적용되는 것은
-- 요일 정보가  월요일, MON 으로 표기 되는 경우는 TO_CHAR,TO_DATE 사용 시에만 적용됩니다.
-- 현재 NLS_LANGUAGE 및 NLS_DATE_LANGUAGE 체크  
select * from nls_session_parameters
where PARAMETER in  ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');

--  NLS_LANGUAGE        AMERICAN
--  NLS_TERRITORY        AMERICA
--  NLS_DATE_FORMAT        DD-MON-RR
--  NLS_DATE_LANGUAGE    AMERICAN
--  NLS_SORT            BINARY

--  Client NLS_LANG Setting 값 없이 Database 에 Login 하면,
--  DB Creation 시의 Default 값이, 즉 NLS_LANGUAGE[AMERICAN],NLS_TERRITORY[AMERICA] 값을 가지게 된다.
--  또한 NLS_DATE_LANGUAGE[AMERICAN] 값은 특별히 지정하지 않는 경우 ,
--  NLS_LANGUAGE[AMERICAN] 값을 상속한다.


-- 데이타 조회(변경 없음)
SELECT HIREDATE FROM SCOTT.EMP WHERE  EMPNO = 7369 ;
-- 1980/12/17 00:00:00
-- TO_CHAR 를 사용해서 데이타 조회, DEC !!
SELECT TO_CHAR(HIREDATE,'YYYYMONDD') FROM SCOTT.EMP WHERE  EMPNO = 7369 ;
-- 1980DEC17

-- NLS_LANGUAGE 값을 KOREAN 으로 변경
ALTER SESSION SET NLS_LANGUAGE='KOREAN';
select * from nls_session_parameters
where PARAMETER in  ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');

--NLS_LANGUAGE        KOREAN
--NLS_TERRITORY        AMERICA
--NLS_DATE_FORMAT   DD-MON-RR
--NLS_DATE_LANGUAGE    KOREAN
--NLS_SORT            BINARY
===> NLS_LANGUAGE 값이 KOREAN 으로 변경되면, NLS_DATE_LANGUAGE 값도 KOREAN 으로 변경된다.

-- 데이타 조회(변경 없음)
SELECT HIREDATE FROM SCOTT.EMP WHERE  EMPNO = 7369 ;
-- 1980/12/17 00:00:00
-- TO_CHAR 를 사용해서 데이타 조회, 12월
SELECT TO_CHAR(HIREDATE,'YYYYMONDD') FROM SCOTT.EMP WHERE  EMPNO = 7369 ;
-- 198012월17
[출처] NLS_LANG 정리|작성자 노란사자

댓글 없음:

댓글 쓰기