본문 바로가기
Oracle

[Oracle] ORA-01861 : 리터럴이 형식 문자열과 일치하지 않음

by 상후 2021. 7. 31.
728x90
반응형

 

ORA-01861 : 리터럴이 형식 문자열과 일치하지 않음 (해결방법)

ORA-01861: literal does not match format string

 

출처 : Oracle Docs

발생 원인
1. 문자열(VARCHAR2) 타입과 DATE 타입을 비교할 때
2. DATE 타입에 문자열(VARCHAR2) 타입의 데이터를 삽입할 때

 

컬럼명(Column) 데이터 타입(Data Type)
NAME VARCHAR2(10)
INSERT_DATE DATE

테이블(TEMP) 컬럼은 위와 같은 구성이라 가정합니다.

 

테스트 케이스

 

-- 1. 문자열(VARCHAR2) 타입과 DATE 타입을 비교할 때
SELECT * 
  FROM TEMP
 WHERE NAME = SYSDATE;

SELECT * 
  FROM TEMP
 WHERE INSERT_DATE > '2021-08-10';

-- 2. DATE 타입에 문자열(VARCHAR2) 타입의 데이터를 삽입할 때
INSERT 
  INTO TEMP(INSERT_DATE)
VALUES ('2021-08-10');

 

해결 방법
비교하는 대상의 타입을 일치시켜줍니다.

TO_DATE() : 날짜 형식으로 타입 변경
TO_CHAR() : 문자열 형식으로 타입 변경

 

-- 1. 문자열(VARCHAR2) 타입과 DATE 타입을 비교할 때 (해결방법)
SELECT * 
  FROM TEMP
 WHERE NAME = TO_CHAR(SYSDATE);

SELECT * 
  FROM TEMP
 WHERE INSERT_DATE > TO_DATE('2021-08-10','YYYY-MM-DD');

-- 2. DATE 타입에 문자열(VARCHAR2) 타입의 데이터를 삽입할 때 (해결방법)
INSERT 
  INTO TEMP(INSERT_DATE)
VALUES (TO_DATE('2021-08-10','YYYY-MM-DD'));

 

필자는 오라클 11g 버전을 사용하고 있는데,

VARCHAR2 타입에 DATE 타입을 삽입할 때는 정상 동작하네요!

 

-- VARCHAR2에 SYSDATE 삽입 시 정상 동작
INSERT 
  INTO TEMP(NAME) 
VALUES (SYSDATE);

INSERT 
  INTO TEMP(NAME) 
VALUES (TO_DATE('2021-08-10','YYYY-MM-DD'));

 

자주 만나볼 수도 있는 오류인데, 대부분 개발자의 실수로 발생되는 것 같다.

항상 데이터 간 타입 및 크기를 고려하고 적절한 형 변환 함수를 사용하자.

 


 

추가적인 원인도 발견하여 기록합니다.

 

서버의 언어 설정에 따라 오류가 발생하기도 합니다.

설정이 달라 묵시적인 형 변환을 못하는게 원인이라고 합니다.  

 

언어 설정은 echo $LANG 또는 locale 명령으로 확인가능합니다.

저는 한 쪽은 ko_KR.UTF-8 / en_US.UTF8 이렇게 차이를 보였습니다.

 

설정 후 echo $LANG과 date 명령어를 통해 확인할 수 있습니다.

 

date 명령어 출력값 : 2024.05.09 (목) 13:22:03 KST
echo $LANG 출력값 : ko_KR.UTF-8

 

 

혹시 로컬에선 정상, 서버에선 오류가 발생하면 해당 설정도 확인해보면 좋을 것 같습니다.

 

 

참고 : https://mkil.tistory.com/464

 

 

728x90
반응형

댓글