ORA-12705: Cannot access NLS data files or invalid environment specified

한글 버전 Windows2012R2 Server에서 Oracle Database를 설치해 orcl인스턴스를 기동해서 접속하면 모든 메시지의 기본 언어는 한글로 표시 됩니다. 이 메시지를 영문으로 표시하고 싶어서 ‘set NLS_LANG=AMERICAN_AMERICA.ASCII로 환경 변수를 변경하고 sqlplus로 서버에 orcl인스턴스에 접속했더니 다음과 같이 오류가 발생했습니다. 이유로는 단순 실수로 Character set에 지정을 정의 목록에 있는US7ASCII를 없는ASCII로 잘못 입력한 결과 인데, NLS_LANG가 어떤 역할을 하는지 궁금하게 되어 조사한 내용을 이 글에서 소개합니다.

C:\>set NLS_LANG=AMERICAN_AMERICA.ASCII
C:\>sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sat Jun 5 19:05:41 2021
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
ERROR:
ORA-12705: Cannot access NLS data files or invalid environment specified
Enter user-name:

NLS_LANG란?

NLS_LANG은 <Language>_<Territory>.<Character set>의 3가지 요소로 구성되어있습니다. 설정 예는 다음과 같습니다. 주의할 사항으로는 Territory를 위한 구분자 underscore (_) 하고 Character set를 위한 구분자 period (.) 를 생략하게 되면 존재하지 않은 Language의 정의로 인식되어 ORA-12705오류가 발생할 수 있습니다.

  • 설정 예
Windows regedit.exe 또는 cmdset NLS_LANG=KOREAN_KOREA.KO16MSWIN949
Unix/Linuxexport NLS_LANG=KOREAN_KOREA.KO16MSWIN949
  • Language는 메시지에 사용되는 언어, 정령(sort), 요일 이름 및 월 이름과 같은 규칙을 지정합니다. 지정되어 있지 않은 경우 기본 값은 AMERICAN입니다.
  • Territory는 기본 날짜, 통화 및 숫자 형식의 규칙을 지정합니다. 지정되어 있지 않은 경우 Language의 값에 연결된 기본 값이 지정됩니다. AMERICAN은 AMERICA, KOREAN은 KOREA 와 같이 서로 기본 값이 지정되어 있습니다.
  • Character set는 클라이언트 응용프로그램에서 사용하는 Character set을 지정합니다. 사용자의 터미널 또는 OS의 Character set에 대응해서 US7ASCII , WE8ISO8859P1 , WE8DEC , WE8MSWIN1252 , or KO16MSWIN949와 같은 별칭이 있으며 각Language에는 기본 값이 지정되어 있습니다.

영문 메시지 NLS_LANG 설정 예

다음은 sql명령 실행 시 표시되는 모든 메시지를 영어로 표시하는 NLS_LANG설정 예입니다.

C:\>set NLS_LANG=AMERICAN_AMERICA.US7ASCII
C:\>sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jun 6 13:38:24 2021
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
SQL> show user
USER is "SYS"
SQL>

한글 메시지 NLS_LANG 설정 예

다음은 sql명령 실행 시 표시되는 모든 메시지를 한글로 표시하는 NLS_LANG설정 예입니다.

C:\>set NLS_LANG=KOREAN_KOREA.KO16MSWIN949
C:\>sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 일 6월 6 13:46:57 2021
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
다음에 접속됨:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
SQL> show user
USER은 "SYS"입니다
SQL>

한글 OS에서 Japanese_Japan.JA16SJIS같이 메시지를 일본어로 표시하고 싶어도 OS가 표시할 수 없는 언어는 다음과 같이 깨져서 나옵니다.

C:\>set NLS_LANG=Japanese_Japan.JA16SJIS
C:\>sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 볷 6뙉 6 15:39:54 2021
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
궸먝뫏궠귢귏궢궫갃
SQL> 

환경 변수 우선순위

참고로 Windows는 Oracle Database를 설치해 특정 Instance를 만들 때 레지스트리에 NLS_LANG와 같은 관련 환경 변수를 설정합니다. 이를 regedit.exe명령을 실행해 확인 하면 다음과 같습니다.

[Windows키Windows Key] + [R] 키를 눌러 “실행”대화 상자를 열고 “regedit”를 입력 실행 해서 [레지스트리 편집기] 화면을 표시합니다.

[컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDB12Home1]을 선택 하면 오른쪽 영역에 환경 변수 NLS_LANG가 설정되어 있음을 확인 할 수 있습니다.

Windows OS의 환경 변수는 “레지스트리 설정” 이외에 “Windows 화면(환경 변수 설정 화면) 설정”, “MS-DOS 명령 프롬프트 창(배치 파일) 설정”하는 방법이 있습니다. 이 3곳에 환경 변수를 모드 설정했을 때 우선 적용 순서가 있습니다. 자세한 내용은 다음 글을 참조하십시오.

Windows MS-DOS 환경 변수 설정 방법
환경 변수(environment variable )는 운영 체제(OS)가 제공하는 데이터 공유 기능의 하나 입니다. 이 글에서는 Windows OS의 어디에서 환경 변수를 설정할 수 있는지 를 소개합니다. 이 글은 ...
제목과 URL을 복사했습니다