DB(Database)/ORACLE

Oracle Character Set 변환(3): 3.Client 환경 구성(2)

ProDA 2022. 3. 7.

이 글은 새로운 블로그로 옮겼습니다. 5초후 자동으로 이동합니다.

▶ 새로운 블로그 주소: https://prodskill.com/

▶ 새로운 글 주소: https://prodskill.com/oracle-character-set-migration-3-client-env-config-2/

목차


    3.2. 테스트 케이스 실행결과 정리

    앞 글(3.Client 환경 구성(1))의 각 테스트 케이스 실행결과를 다음과 같이 정리하였다.

    Case # Server
    Character Set
    Client NLS_LANG 입력 출력 DUMP 
    1 US7ASCII KO16KSC5601 한글 성공 깨짐 Typ=1 Len=2 CharacterSet=US7ASCII: 3f,3f
    실패 - -
    2 US7ASCII KO16MSWIN949 한글 성공 깨짐 Typ=1 Len=2 CharacterSet=US7ASCII: 3f,3f
    성공 깨짐 Typ=1 Len=1 CharacterSet=US7ASCII: 3f
    3 US7ASCII US7ASCII 한글 성공 정상 Typ=1 Len=4 CharacterSet=US7ASCII: c7,d1,b1,db
    성공 정상 Typ=1 Len=2 CharacterSet=US7ASCII: 98,de
    4 KO16MSWIN949 KO16KSC5601 한글 성공 정상 Typ=1 Len=4 CharacterSet=KO16MSWIN949: c7,d1,b1,db
    실패 - -
    5 KO16MSWIN949 KO16MSWIN949 한글 성공 정상 Typ=1 Len=4 CharacterSet=KO16MSWIN949: c7,d1,b1,db
    성공 정상 Typ=1 Len=2 CharacterSet=KO16MSWIN949: 98,de
    6 KO16MSWIN949 US7ASCII 한글 성공 깨짐 Typ=1 Len=4 CharacterSet=KO16MSWIN949: 3f,3f,3f,3f
    성공 깨짐 Typ=1 Len=2 CharacterSet=KO16MSWIN949: 3f,3f
    7 AL32UTF8 KO16KSC5601 한글 성공 정상 Typ=1 Len=6 CharacterSet=AL32UTF8: ed,95,9c,ea,b8,80
    실패 - -
    8 AL32UTF8 KO16MSWIN949 한글 성공 정상 Typ=1 Len=6 CharacterSet=AL32UTF8: ed,95,9c,ea,b8,80
    성공 정상 Typ=1 Len=3 CharacterSet=AL32UTF8: ec,83,be
    9-1 AL32UTF8 AL32UTF8
    (cmd)
    한글 실패 - -
    실패 - -
    9-2 AL32UTF8 AL32UTF8
    (PowerShell)
    한글 성공 정상 Typ=1 Len=6 CharacterSet=AL32UTF8: ed,95,9c,ea,b8,80
    성공 정상 Typ=1 Len=3 CharacterSet=AL32UTF8: ec,83,be

     

    3.3 Oracle Server Character Set과 Client NLS_LANG 권장 구성

    한글 입출력을 위한 Oracle Server와 Client 환경 구성은 다음과 같은 4가지 조합이 가능하다.

    Case # Server
    Character Set
    Client
    NLS_LANG
    Comment
    3 US7ASCII US7ASCII 절대로 사용하지 말자. 기존 환경을 바꿀 수 없는 경우에만 사용!!!
    5 KO16MSWIN949 KO16MSWIN949 한글, 영문자, 숫자, 특수문자, 한자 등 한글 Windows 상에서 지원하는 문자만 저장하고, 입출력하는 경우에 사용 (서버에 다국어 문자 저장 불가)
    8 AL32UTF8 KO16MSWIN949 서버는 다국어 환경이고, Client에서는 한글만을 입출력하는 경우에 사용. Client application Unicode를 처리할 수 없는 경우에 사용 가능함
    9 AL32UTF8 AL32UTF8 Server에 저장된 값을 변환하지 않고, Client로 그대로 전송함.
    , Client에서 UTF8로 인코딩된 데이터를 직접 handling해야 함.

     

    Case #3은 입출력에 문제가 없어 보이지만, Dump 값을 보면 Character Set이 US7ASCII로 되어 있음을 알 수 있다. 즉, 실제 입출력은 US7ASCII의 1 byte 단위로 실행한다는 의미이고, 잘못 저장되어 있는 상태이다.

    Case #3 실행결과
    Case #3 실행결과

     

    이 데이터를 외부 시스템에 EAI, ETL, ESB 등을 통하여 전송하는 경우 한글 문자가 깨지는 현상이 발생하고, 정확한 데이터 교환에 많은 어려움을 겪게 된다. 따라서 Case #3은 절대로 피해야 하는 설정이다.

     

    Case 9-1은 원래 문제없이 입출력되는 설정이나, Windows 명령 프롬프트인 cmd.exe 에서 Unicode 입출력을 지원하지 않아 발생하는 현상이다.
    Windows PowerShell에서 Case 9-2를 확인해 보면 정상적으로 입출력되는 것을 확인할 수 있다.

     

    한글외에 중국문자, 일본문자, 태국문자, 서유럽 문자 등의 다국어 문자를 저장하기 위해서는 다음의 2가지 조합이 가능하다.

    Case # Server
    Character Set
    Client
    NLS_LANG
    Comment
    8 AL32UTF8 각 언어 문자에 따라 설정 Client NLS_LANG 설정
    - 한글일 경우: KO16MSWIN949
    - 중국문자: ZHS16GBK, 또는 ZHT16MSWIN950, 또는 ZHT16HKSCS
    - 일본문자: JA16SJIS
    - 태국문자: TH8TISASCII
    아래 표 참조
    9 AL32UTF8 AL32UTF8 Server에 저장된 값을 변환하지 않고, Client로 그대로 전송함.
    , Client에서 UTF8로 인코딩된 데이터를 직접 handling해야 함.

     

    위에서 언급된 <각 언어 문자에 따라 설정>하는 Client NLS_LANG값의 목록은 다음과 같다.

    Operating System Locale NLS_LANG Value
    Arabic (U.A.E.) ARABIC_UNITED ARAB EMIRATES.AR8MSWIN1256
    Bulgarian BULGARIAN_BULGARIA.CL8MSWIN1251
    Catalan CATALAN_CATALONIA.WE8MSWIN1252
    Chinese (PRC) SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    Chinese (Taiwan) TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
    Chinese (Hong Kong HKCS) TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS
    Chinese (Hong Kong HKCS2001) TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS2001 (new in 10gR1)
    Croatian CROATIAN_CROATIA.EE8MSWIN1250
    Czech CZECH_CZECH REPUBLIC.EE8MSWIN1250
    Danish DANISH_DENMARK.WE8MSWIN1252
    Dutch (Netherlands) DUTCH_THE NETHERLANDS.WE8MSWIN1252
    Dutch (Belgium) DUTCH_BELGIUM.WE8MSWIN1252
    English (United Kingdom) ENGLISH_UNITED KINGDOM.WE8MSWIN1252
    English (United States) AMERICAN_AMERICA.WE8MSWIN1252
    Estonian ESTONIAN_ESTONIA.BLT8MSWIN1257
    Finnish FINNISH_FINLAND.WE8MSWIN1252
    French (Canada) CANADIAN FRENCH_CANADA.WE8MSWIN1252
    French (France) FRENCH_FRANCE.WE8MSWIN1252
    German (Germany) GERMAN_GERMANY.WE8MSWIN1252
    Greek GREEK_GREECE.EL8MSWIN1253
    Hebrew HEBREW_ISRAEL.IW8MSWIN1255
    Hungarian HUNGARIAN_HUNGARY.EE8MSWIN1250
    Icelandic ICELANDIC_ICELAND.WE8MSWIN1252
    Indonesian INDONESIAN_INDONESIA.WE8MSWIN1252
    Italian (Italy) ITALIAN_ITALY.WE8MSWIN1252
    Japanese JAPANESE_JAPAN.JA16SJIS
    Korean KOREAN_KOREA.KO16MSWIN949
    Latvian LATVIAN_LATVIA.BLT8MSWIN1257
    Lithuanian LITHUANIAN_LITHUANIA.BLT8MSWIN1257
    Norwegian NORWEGIAN_NORWAY.WE8MSWIN1252
    Polish POLISH_POLAND.EE8MSWIN1250
    Portuguese (Brazil) BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252
    Portuguese (Portugal) PORTUGUESE_PORTUGAL.WE8MSWIN1252
    Romanian ROMANIAN_ROMANIA.EE8MSWIN1250
    Russian RUSSIAN_CIS.CL8MSWIN1251
    Slovak SLOVAK_SLOVAKIA.EE8MSWIN1250
    Spanish (Spain) SPANISH_SPAIN.WE8MSWIN1252
    Swedish SWEDISH_SWEDEN.WE8MSWIN1252
    Thai THAI_THAILAND.TH8TISASCII
    Spanish (Mexico) MEXICAN SPANISH_MEXICO.WE8MSWIN1252
    Spanish (Venezuela) LATIN AMERICAN SPANISH_VENEZUELA.WE8MSWIN1252
    Turkish TURKISH_TURKEY.TR8MSWIN1254
    Ukrainian UKRAINIAN_UKRAINE.CL8MSWIN1251
    Vietnamese VIETNAMESE_VIETNAM.VN8MSWIN1258

    *출처: NLS_LANG FAQ (oracle.com) 문서의 <List of common NLS_LANG settings used in the Windows Registry> 내용

     

    여기서 한가지 의문이 생길 수 있다.

     

    서버의 Character Set은 Unicode체계인 AL32UTF8로 지정했는데, 왜 Client NLS_LANG은 2 byte 체계인 KO16MSWIN949를 지정해야 할까?

     

    이는 Windows 운영체제가 한글을 encoding/decoding하는 기본 방법이기 때문이다. (참고로, UNiX상에서 한글을 입출력 할 경우는 KO16KSC5601를 사용하는 것이 일반적이다.) 다시 언급하자면, Server Character Set은 문자열 데이터를 “저장”하기 위한 설정이고, Client NLS_LANG은 문자열 데이터를 “보여”주고, “전송”하기 위한 설정이다.

     

    Server Character Set은 여러국가의 문자를 “저장”하기 위하여 Unicode 체계인 AL32UTF8을 지정하고, 이 서버에 접속하는 여러 나라의 Client(주로 Windows) 환경에서는 각 언어별 Windows에서 지원하는 기본 encoding/decoding 체계를 지정하는 것이다. Non-Unicode 로 입력되는 데이터는 Oracle client와 SQL*Net을 통해 서버로 전달되면서 Unicode로 변환되어 저장된다.


    Server Character Set이 AL32UTF8일 때 Client NLS_LANG을 동일하게 AL32UTF8로 지정하면, 서버에 저장되어 있는 Unicode 값이 변환과정 없이 Client로 전달된다. 즉, Client NLS_LANG을 AL32UTF8로 지정하려면, Client에서 Unicode를 encoding/decoding할 수 있어야 한다.

     

    참고로 무료로 제공되는 Tool중 ORACLE SQL Developer가 대표적으로 Unicode를 잘 지원하는 Tool이다. DBeaver도 jdbc 기반으로 Unicode를 잘 지원한다.

     


     

    지금까지의 내용이 복잡하여 Character Set 선택이 어렵다고 생각한다면 아래 내용만 기억하면 된다.

    • Server Character Set은 AL32UTF8로 설정
    • Client NLS_LANG
      • client에서 유니코드를 처리하지 못하거나 특정 언어로 한정되는 경우 해당 언어에 해당하는 값 설정
      • client에서 유니코드를 처리할 수 있는 경우 AL32UTF8

     

     

    지금까지 Oracle Character Set 관련 Client 환경 구성에 대해 살펴보았다.

    다음 글에서는 Server Character Set이 US7ASCII이고 한글이 저장되어 있는 잘못된 환경에서 Character Set을 변환하는 방법에 대해 살펴보겠다.

    댓글

    💲 추천 글