# 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