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

Oracle Character Set 변환 Client 환경 구성 에 대해 살펴본다. Server Character Set과 Client NLS_LANG 설정을 9가지 테스트 케이스로 나누어 각각을 테스트한 결과를 확인할 수 있다.

이전 글에서 이어지는 내용이다.

Oracle Character Set 변환(1): 1. 필요성, 올바른 Oracle Character Set 설정 가이드

3. Oracle Character Set 변환 Client 환경 구성

Oracle Client에서 Character Set을 설정하기 위한 환경 변수는 NLS_LANG 이다.

* 참고 Oracle 문서: Choosing a Locale with the NLS_LANG Environment Variable (oracle.com)

흔히, Client NLS_LANG은 Server의 Character Set과 일치시켜야 한다고 생각하는데, 이는 강제사항이 아니다. Server Character Set은 문자열 데이터를 “저장”하기 위한 설정이고, Client NLS_LANG은 문자열 데이터를 “보여”주고, “전송”하기 위한 설정이다.

다시 말해서, Server Character Set이 잘못 설정되면 문자열 데이터의 저장이 잘못되는 것이고, Client NLS_LANG 이 잘못 설정되면 문자열 데이터를 잘못 보여주고, 잘못 전송하게 된다.

Server Character Set과 Client NLS_LANG 설정의 케이스를 다음과 같이 정의하고 테스트한 결과를 살펴보자.

Case #Server Character SetClient NLS_LANG
1US7ASCIIAMERICAN_AMERICA.KO16KSC5601
2US7ASCIIAMERICAN_AMERICA.KO16MSWIN949
3US7ASCIIAMERICAN_AMERICA.US7ASCII
4KO16MSWIN949AMERICAN_AMERICA.KO16KSC5601
5KO16MSWIN949AMERICAN_AMERICA.KO16MSWIN949
6KO16MSWIN949AMERICAN_AMERICA.US7ASCII
7AL32UTF8AMERICAN_AMERICA.KO16KSC5601
8AL32UTF8AMERICAN_AMERICA.KO16MSWIN949
9AL32UTF8AMERICAN_AMERICA.AL32UTF8

Server Character Set을 서로 다르게 테스트하기 위하여 Local PC에 세 개의 Oracle instance를 구성하고 TNS Name을 각각 oraus7, oramswin949, orautf로 지정하였다.

테스트 DB서버 (Local PC) 구성
테스트 DB서버 (Local PC) 구성
  • oraus7: US7ASCII
  • oramswin949: KO16MSWIN949
  • orautf: AL32UTF8

각 테스트 케이스의 Input 값은 “한글” 과 “샾”의 두 가지로 선정하였다.

“한글”은 일반적인 한글 입출력이 가능한지 확인하고자 하는 것이고, “샾”은 KSC5601에서 지원하지 않는 문자에 대한 입출력을 확인하고자 함이다.

테스트 스크립트(예시)와 설명은 다음과 같다.

-- Windows command prompt 환경
title Test Case (1) US7ASCII, AMERICAN_AMERICA.KO16KSC5601
set NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
sqlplus -S leg/leg@oraus7

-- sqlplus 환경
TRUNCATE TABLE Z_TEST;
INSERT INTO Z_TEST(VAL) VALUES('한글');
INSERT INTO Z_TEST(VAL) VALUES('샾');
COMMIT;
SELECT VAL, DUMP(VAL, 1016) DP FROM Z_TEST;
EXIT;
  • 2행: 식별이 용이하도록 Command prompt 창의 제목을 설정 (각 테스트 케이스별 다르게 설정함. 아래 참조)
  • 3행: NLS_LANG 설정 (각 테스트 케이스별 다르게 설정함. 아래 참조)
  • 4행: sqlplus 실행 및 접속 (각 테스트 케이스별 다르게 설정함. 아래 참조)
  • 7행: 테스트 테이블(Z_TEST) Truncate
  • 8행: “한글” 값 입력
  • 9행: “샾” 값 입력
  • 10행: COMMIT 실행
  • 11행: 입력값과 DUMP 함수 결과값을 출력
    • 참고: DUMP 함수의 두 번째 parameter를 1016으로 지정하면, 저장되어 있는 값의 길이(Byte수), Character Set, 각 Byte의 16진수 표현 값을 확인할 수 있다.
  • 12행: 종료

3.1. 테스트 케이스별 결과

3.1.1. Case #1 (US7ASCII – KO16KSC5601)

  • Server Character Set: US7ASCII (sqlplus -S leg/leg@us7ascii)
  • Client NLS_LANG: AMERICAN_AMERICA.KO16KSC5601
  • 실행결과
    • ‘한글’: 입력은 성공, 출력은 실패(물음표(??)로 출력)
    • ‘샾’: 입력 실패
Oracle Character Set 변환 Client 환경 구성 Case #1 실행결과
Oracle Character Set 변환 Client 환경 구성 Case #1 실행결과

3.1.2. Case #2 (US7ASCII – KO16MSWIN949)

  • Server Character Set: US7ASCII (sqlplus -S leg/leg@us7ascii)
  • Client NLS_LANG: AMERICAN_AMERICA.KO16MSWIN949
  • 실행결과
    • ‘한글’: 입력은 성공, 출력은 실패(물음표(??)로 출력)
    • ‘샾’:입력은 성공, 출력은 실패(물음표(?)로 출력)
Case #2 실행결과
Case #2 실행결과

3.1.3. Case #3 (US7ASCII – US7ASCII)

  • Server Character Set: US7ASCII (sqlplus -S leg/leg@us7ascii)
  • Client NLS_LANG: AMERICAN_AMERICA.US7ASCII
  • 실행결과
    • ‘한글’: 입력, 출력 성공 (잘못 저장되어 있는 상태임)
    • ‘샾’: 입력, 출력 성공 (잘못 저장되어 있는 상태임)
Case #3 실행결과
Case #3 실행결과

3.1.4. Case #4 (KO16MSWIN949 – KO16KSC5601)

  • Server Character Set: KO16MSWIN949 (sqlplus -S leg/leg@oramswin949)
  • Client NLS_LANG: AMERICAN_AMERICA.KO16KSC5601
  • 실행결과
    • ‘한글’: 입력, 출력 성공
    • ‘샾’: 입력 실패
Case #4 실행결과
Case #4 실행결과

3.1.5. Case #5 (KO16MSWIN949 – KO16MSWIN949)

  • Server Character Set: KO16MSWIN949 (sqlplus -S leg/leg@oramswin949)
  • Client NLS_LANG: AMERICAN_AMERICA.KO16MSWIN949
  • 실행결과
    • ‘한글’: 입력, 출력 성공
    • ‘샾’: 입력, 출력 성공
Case #5 실행결과
Case #5 실행결과

3.1.6. Case #6 (KO16MSWIN949 – US7ASCII)

  • Server Character Set: KO16MSWIN949 (sqlplus -S leg/leg@oramswin949)
  • Client NLS_LANG: AMERICAN_AMERICA.US7ASCII
  • 실행결과
    • ‘한글’: 입력은 성공, 출력은 실패(물음표(????)로 출력)
    • ‘샾’:입력은 성공, 출력은 실패(물음표(??)로 출력)
Case #6 실행결과
Case #6 실행결과

3.1.7. Case #7 (AL32UTF8 – KO16KSC5601)

  • Server Character Set: AL32UTF8 (sqlplus -S leg/leg@orautf)
  • Client NLS_LANG: AMERICAN_AMERICA.KO16KSC5601
  • 실행결과
    • ‘한글’: 입력, 출력 성공
    • ‘샾’: 입력 실패
Case #7 실행결과
Case #7 실행결과

3.1.8. Case #8 (AL32UTF8 – KO16MSWIN949)

  • Server Character Set: AL32UTF8 (sqlplus -S leg/leg@orautf)
  • Client NLS_LANG: AMERICAN_AMERICA.KO16MSWIN949
  • 실행결과
    • ‘한글’: 입력, 출력 성공
    • ‘샾’: 입력, 출력 성공
Case #8 실행결과
Case #8 실행결과

3.1.9. Case #9-1 (AL32UTF8 – AL32UTF8)

  • Server Character Set: AL32UTF8 (sqlplus -S leg/leg@orautf)
  • Client NLS_LANG: AMERICAN_AMERICA.AL32UTF8
  • 실행결과
    • ‘한글’: 입력, 출력 성공
    • ‘샾’: 입력 실패: Windows 명령 프롬프트(cmd.exe)의 기본 code page는 949(ANSI)로서, UTF-8 입출력을 지원하지 않아서 정상적으로 실행되지 않는다. UTF-8 입출력을 지원하는 PowerShell로 실행(Case #9-2)하면 정상적으로 입출력이 됨을 확인할 수 있다.
Case #9-1 실행결과
Case #9-1 실행결과

3.1.10. Case #9-2 (AL32UTF8 – AL32UTF8) – UTF-8 지원 PowerShell로 실행

  • Server Character Set: AL32UTF8 (sqlplus -S leg/leg@orautf)
  • Client NLS_LANG: AMERICAN_AMERICA.AL32UTF8
  • 실행결과
    • ‘한글’: 입력, 출력 성공
    • ‘샾’: 입력, 출력 성공
Case #9-2 실행결과
Case #9-2 실행결과

여기까지 Oracle Character Set 변환 Client 환경 구성 과 테스트 케이스별 결과를 살펴보았다. 다음 글에서는 이 결과를 정리하고 권장 구성에 대해 살펴보겠다.

답글 남기기

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

ko_KR한국어