본문 바로가기
Database/Oracle

[Oracle]ORA-01861:literal does not match format string 원인과 해결 방법

by 코딩 시그널 2020. 7. 20.
반응형

오늘 회사 후배가 출근은 하시자 마자 옆에 있는 동기에게 질문을 했다.

"내 로컬 환경 DB에서는 Date타입 칼럼에 String을 넣었을 때 정상 동작했는데 같은 DB인데 개발 서버에서는 오류가 나요ㅠ  왜 그런 거예요..ㅠ" 음.. 나도 신입 때 똑같은 현상을 겪고 문제는 해결한 적이 있었다. 물론 to_date 명시적으로 형 변환을 해서 문제를 해결했던 기억이 나는데.. 정확하게 왜 그런 현상이 발생하는지는 찾아보진 않았다. 연차가 쌓이면서 느끼는 거지만.. 문제가 발생했을 때 정확히 원인을 파악하고 내 것으로 익히려는 노력을 해야겠다.  

 

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

위의 오라클 에러는 내 개발 환경에서는 정상 동작 하는데 실제 서버에서는 문제가 발생하는 오류 중에 하나이다.

 

- 발생원인

 

OS의 Lang설정이 달라 문자 열을 묵시적으로 날짜로 변환을 못해서 발생하는 오류이다.

묵시적으로 변환하고 싶다면 모든 클라이언트의 환경변수 LANG or NLS_LANG 설정을 맞춰야 한다.

예를 들어 JDBC THIN CLIENT 를 사용하는 JDBC 프로그램 같은 경우 NLS_DATE_FORMAT의 디폴트값은 NLS_TERRITORY에 의해 결정된다

 

NLS_DATE_FORMAT

NLS_DATE_FORMAT Property Description Parameter type String Syntax NLS_DATE_FORMAT = "format" Default value Derived from NLS_TERRITORY Modifiable ALTER SESSION Range of values Any valid date format mask but not exceeding a fixed length Basic No NLS_DATE_FOR

docs.oracle.com

 

그리고 NLS_TERRITORY의 디폴트값은 OS dependent 임을 알 수 있다. 

즉!! OS 환경변수인 NLS_LANG 설정에 영향을 받습니다.

 

NLS_TERRITORY

NLS_TERRITORY Property Description Parameter type String Syntax NLS_TERRITORY = territory Default value Operating system-dependent Modifiable ALTER SESSION Range of values Any valid territory name Basic Yes NLS_TERRITORY specifies the name of the territory

docs.oracle.com

하지만 이 방법은 모든 애플리케이션 서버의 LANG을 세팅해야 하므로 좋은 방법은 아니다.

 

- 해결 방법

 

1. Date 형을 String 형으로 변환

TO_CHAR(SYSDATE, 'YYYYMMDD')

 

2. String형을 Date형으로 변환

TO_DATE('2020-07-01','YYYYMMDD')

 

 

 

 

 

댓글