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 값 |
---|---|---|---|---|---|---|
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 단위로 실행한다는 의미이고, 잘못 저장되어 있는 상태이다.
이 데이터를 외부 시스템에 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을 변환하는 방법에 대해 살펴보겠다.