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 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로 지정하였다.
- 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
- 실행결과
- ‘한글’: 입력은 성공, 출력은 실패(물음표(??)로 출력)
- ‘샾’: 입력 실패
3.1.2. Case #2 (US7ASCII – KO16MSWIN949)
- Server Character Set: US7ASCII (sqlplus -S leg/leg@us7ascii)
- Client NLS_LANG: AMERICAN_AMERICA.KO16MSWIN949
- 실행결과
- ‘한글’: 입력은 성공, 출력은 실패(물음표(??)로 출력)
- ‘샾’:입력은 성공, 출력은 실패(물음표(?)로 출력)
3.1.3. Case #3 (US7ASCII – US7ASCII)
- Server Character Set: US7ASCII (sqlplus -S leg/leg@us7ascii)
- Client NLS_LANG: AMERICAN_AMERICA.US7ASCII
- 실행결과
- ‘한글’: 입력, 출력 성공 (잘못 저장되어 있는 상태임)
- ‘샾’: 입력, 출력 성공 (잘못 저장되어 있는 상태임)
3.1.4. Case #4 (KO16MSWIN949 – KO16KSC5601)
- Server Character Set: KO16MSWIN949 (sqlplus -S leg/leg@oramswin949)
- Client NLS_LANG: AMERICAN_AMERICA.KO16KSC5601
- 실행결과
- ‘한글’: 입력, 출력 성공
- ‘샾’: 입력 실패
3.1.5. Case #5 (KO16MSWIN949 – KO16MSWIN949)
- Server Character Set: KO16MSWIN949 (sqlplus -S leg/leg@oramswin949)
- Client NLS_LANG: AMERICAN_AMERICA.KO16MSWIN949
- 실행결과
- ‘한글’: 입력, 출력 성공
- ‘샾’: 입력, 출력 성공
3.1.6. Case #6 (KO16MSWIN949 – US7ASCII)
- Server Character Set: KO16MSWIN949 (sqlplus -S leg/leg@oramswin949)
- Client NLS_LANG: AMERICAN_AMERICA.US7ASCII
- 실행결과
- ‘한글’: 입력은 성공, 출력은 실패(물음표(????)로 출력)
- ‘샾’:입력은 성공, 출력은 실패(물음표(??)로 출력)
3.1.7. Case #7 (AL32UTF8 – KO16KSC5601)
- Server Character Set: AL32UTF8 (sqlplus -S leg/leg@orautf)
- Client NLS_LANG: AMERICAN_AMERICA.KO16KSC5601
- 실행결과
- ‘한글’: 입력, 출력 성공
- ‘샾’: 입력 실패
3.1.8. Case #8 (AL32UTF8 – KO16MSWIN949)
- Server Character Set: AL32UTF8 (sqlplus -S leg/leg@orautf)
- Client NLS_LANG: AMERICAN_AMERICA.KO16MSWIN949
- 실행결과
- ‘한글’: 입력, 출력 성공
- ‘샾’: 입력, 출력 성공
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)하면 정상적으로 입출력이 됨을 확인할 수 있다.
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
- 실행결과
- ‘한글’: 입력, 출력 성공
- ‘샾’: 입력, 출력 성공
여기까지 Oracle Character Set 변환 Client 환경 구성 과 테스트 케이스별 결과를 살펴보았다. 다음 글에서는 이 결과를 정리하고 권장 구성에 대해 살펴보겠다.