Database/Oracle

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

코딩 시그널 2020. 7. 20. 22:44
반응형

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

"내 로컬 환경 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')