# ORA-01861 방지하기

ORA-01861: literal does not match format string
(리터럴이 형식 문자열과 일치하지 않음)

오라클 쿼리 작성 시 DATE 타입을 잘못 다루었을 때 발생하는 에러입니다.

DATE 포맷을 지정하지 않았을 때 DATE의 묵시적 형변환이 일어나는데, 이 때 머신의 언어 설정에 따라 묵시적 형변환 결과가 달라지면서 특정 환경에서 에러를 유발 할 수 있습니다.

DATE 타입 컬럼의 데이터를 다룰 때는 반드시 포맷을 지정해서 쿼리를 작성해야 ORA-01861 에러를 방지할 수 있습니다.

특정 환경에서만 ORA-01861 에러가 발생할 때 부득이 쿼리를 수정하지 못하는 경우, 머신 언어 설정을 변경하여 에러 발생을 막는 방법이 있습니다.


# 머신 언어설정 변경 방법


# 오라클 클라이언트 툴로 직접 쿼리 수행하는 경우 (ex. Orange, DataGrip, Toad ...)

클라이언트의 언어 설정 따라서 NLS_DATE_FORMAT 이 결정되기 때문에, NLS_LANGUAGE 를 변경하면 DATE 형변환이 어떻게 달라지는지 확인이 가능합니다.

# 세션 레벨의 NLS 확인하기

SELECT *
  FROM NLS_SESSION_PARAMETERS
 WHERE PARAMETER IN ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');
PARAMETER VALUE
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY

# 세션 레벨에서 NLS_LANGUAGE 변경하기

ALTER SESSION SET NLS_LANGUAGE='KOREAN';
PARAMETER VALUE
NLS_LANGUAGE KOREAN
NLS_TERRITORY AMERICA
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE KOREAN
NLS_SORT BINARY

# NLS_LANGUAGE DATE 묵시적 형변환 결과

아래 쿼리를 수행해보면 머신 환경에 따라 다른 결과가 나오는 것을 간단히 확인해 볼 수 있습니다.

SELECT TO_CHAR(SYSDATE)
  FROM DUAL;
NLS_LANGUAGE 결과
AMERICAN 15-DEC-18
KOREAN 15-12월-18

# 머신 지역설정 변경하기

(Windows 는 패스)

# CentOS 7

# 변경하기
localectl set-locale LANG=ko_KR.utf8
# 확인하기
localectl status

# JVM

-Duser.country=KR -Duser.language=ko


# 요약. ORA-01861 방지하는 방법 2가지

# 방법1. 쿼리 작성시 DATE FORMAT 을 꼭 지정해서 작성하기

# 방법2. 머신의 언어 설정을 (쿼리가 정상 수행된)로컬 개발환경과 맞추기