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

앞 글에 이어서 Oracle Character Set 변환 Client 환경 구성 에 대해 살펴본다. Oracle Server Character Set과 Client NLS_LANG 권장 구성 4가지를 확인할 수 있다.

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

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

Case #Server
Character Set
Client NLS_LANG입력출력DUMP 
1US7ASCIIKO16KSC5601한글성공깨짐Typ=1 Len=2 CharacterSet=US7ASCII: 3f,3f
실패--
2US7ASCIIKO16MSWIN949한글성공깨짐Typ=1 Len=2 CharacterSet=US7ASCII: 3f,3f
성공깨짐Typ=1 Len=1 CharacterSet=US7ASCII: 3f
3US7ASCIIUS7ASCII한글성공정상Typ=1 Len=4 CharacterSet=US7ASCII: c7,d1,b1,db
성공정상Typ=1 Len=2 CharacterSet=US7ASCII: 98,de
4KO16MSWIN949KO16KSC5601한글성공정상Typ=1 Len=4 CharacterSet=KO16MSWIN949: c7,d1,b1,db
실패--
5KO16MSWIN949KO16MSWIN949한글성공정상Typ=1 Len=4 CharacterSet=KO16MSWIN949: c7,d1,b1,db
성공정상Typ=1 Len=2 CharacterSet=KO16MSWIN949: 98,de
6KO16MSWIN949US7ASCII한글성공깨짐Typ=1 Len=4 CharacterSet=KO16MSWIN949: 3f,3f,3f,3f
성공깨짐Typ=1 Len=2 CharacterSet=KO16MSWIN949: 3f,3f
7AL32UTF8KO16KSC5601한글성공정상Typ=1 Len=6 CharacterSet=AL32UTF8: ed,95,9c,ea,b8,80
실패--
8AL32UTF8KO16MSWIN949한글성공정상Typ=1 Len=6 CharacterSet=AL32UTF8: ed,95,9c,ea,b8,80
성공정상Typ=1 Len=3 CharacterSet=AL32UTF8: ec,83,be
9-1AL32UTF8AL32UTF8
(cmd)
한글실패--
실패--
9-2AL32UTF8AL32UTF8
(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
3US7ASCIIUS7ASCII절대로 사용하지 말자. 기존 환경을 바꿀 수 없는 경우에만 사용!!!
5KO16MSWIN949KO16MSWIN949한글, 영문자, 숫자, 특수문자, 한자 등 한글 Windows 상에서 지원하는 문자만 저장하고, 입출력하는 경우에 사용 (서버에 다국어 문자 저장 불가)
8AL32UTF8KO16MSWIN949서버는 다국어 환경이고, Client에서는 한글만을 입출력하는 경우에 사용. Client application이 Unicode를 처리할 수 없는 경우에 사용 가능함
9AL32UTF8AL32UTF8Server에 저장된 값을 변환하지 않고, 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
8AL32UTF8각 언어 문자에 따라 설정Client NLS_LANG 설정
– 한글일 경우: KO16MSWIN949
– 중국문자: ZHS16GBK, 또는 ZHT16MSWIN950, 또는 ZHT16HKSCS
– 일본문자: JA16SJIS
– 태국문자: TH8TISASCII 등
아래 표 참조
9AL32UTF8AL32UTF8Server에 저장된 값을 변환하지 않고, Client로 그대로 전송함.
즉, Client에서 UTF8로 인코딩된 데이터를 직접 handling해야 함.

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

Operating System LocaleNLS_LANG Value
Arabic (U.A.E.)ARABIC_UNITED ARAB EMIRATES.AR8MSWIN1256
BulgarianBULGARIAN_BULGARIA.CL8MSWIN1251
CatalanCATALAN_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)
CroatianCROATIAN_CROATIA.EE8MSWIN1250
CzechCZECH_CZECH REPUBLIC.EE8MSWIN1250
DanishDANISH_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
EstonianESTONIAN_ESTONIA.BLT8MSWIN1257
FinnishFINNISH_FINLAND.WE8MSWIN1252
French (Canada)CANADIAN FRENCH_CANADA.WE8MSWIN1252
French (France)FRENCH_FRANCE.WE8MSWIN1252
German (Germany)GERMAN_GERMANY.WE8MSWIN1252
GreekGREEK_GREECE.EL8MSWIN1253
HebrewHEBREW_ISRAEL.IW8MSWIN1255
HungarianHUNGARIAN_HUNGARY.EE8MSWIN1250
IcelandicICELANDIC_ICELAND.WE8MSWIN1252
IndonesianINDONESIAN_INDONESIA.WE8MSWIN1252
Italian (Italy)ITALIAN_ITALY.WE8MSWIN1252
JapaneseJAPANESE_JAPAN.JA16SJIS
KoreanKOREAN_KOREA.KO16MSWIN949
LatvianLATVIAN_LATVIA.BLT8MSWIN1257
LithuanianLITHUANIAN_LITHUANIA.BLT8MSWIN1257
NorwegianNORWEGIAN_NORWAY.WE8MSWIN1252
PolishPOLISH_POLAND.EE8MSWIN1250
Portuguese (Brazil)BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252
Portuguese (Portugal)PORTUGUESE_PORTUGAL.WE8MSWIN1252
RomanianROMANIAN_ROMANIA.EE8MSWIN1250
RussianRUSSIAN_CIS.CL8MSWIN1251
SlovakSLOVAK_SLOVAKIA.EE8MSWIN1250
Spanish (Spain)SPANISH_SPAIN.WE8MSWIN1252
SwedishSWEDISH_SWEDEN.WE8MSWIN1252
ThaiTHAI_THAILAND.TH8TISASCII
Spanish (Mexico)MEXICAN SPANISH_MEXICO.WE8MSWIN1252
Spanish (Venezuela)LATIN AMERICAN SPANISH_VENEZUELA.WE8MSWIN1252
TurkishTURKISH_TURKEY.TR8MSWIN1254
UkrainianUKRAINIAN_UKRAINE.CL8MSWIN1251
VietnameseVIETNAMESE_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을 변환하는 방법에 대해 살펴보겠다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

ko_KR한국어