DB(Database)/ORACLE

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

ProDA 2022. 3. 7.

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

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

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

3. Oracle Character Set 관련 Client 환경 구성

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

 

흔히, 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 Set Client NLS_LANG
1 US7ASCII AMERICAN_AMERICA.KO16KSC5601
2 US7ASCII AMERICAN_AMERICA.KO16MSWIN949
3 US7ASCII AMERICAN_AMERICA.US7ASCII
4 KO16MSWIN949 AMERICAN_AMERICA.KO16KSC5601
5 KO16MSWIN949 AMERICAN_AMERICA.KO16MSWIN949
6 KO16MSWIN949 AMERICAN_AMERICA.US7ASCII
7 AL32UTF8 AMERICAN_AMERICA.KO16KSC5601
8 AL32UTF8 AMERICAN_AMERICA.KO16MSWIN949
9 AL32UTF8 AMERICAN_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

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

Case #1 실행결과
Case #1 실행결과

 

3.1.2. Case #2

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

Case #2 실행결과
Case #2 실행결과

 

3.1.3. Case #3

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

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

 

3.1.4. Case #4

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

Case #4 실행결과
Case #4 실행결과

 

3.1.5. Case #5

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

Case #5 실행결과
Case #5 실행결과

 

3.1.6. Case #6

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

Case #6 실행결과
Case #6 실행결과

 

3.1.7. Case #7

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

Case #7 실행결과
Case #7 실행결과

 

3.1.8. Case #8

  • 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

  • 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 (UTF-8 지원 PowerShell로 실행)

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

Case #9-2 실행결과
Case #9-2 실행결과

 


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

댓글

💲 추천 글