728x90
반응형
ORA-01861 : 리터럴이 형식 문자열과 일치하지 않음 (해결방법)
ORA-01861: literal does not match format string
발생 원인
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
반응형
'Oracle' 카테고리의 다른 글
[Oracle] ORA-00001 : 유일성(무결성) 제약조건에 위배됩니다 (0) | 2021.08.07 |
---|---|
[Oracle] ORA-08002 시퀀스 SEQ.currval 은 이 세션에서는 정의되어 있지 않습니다 (0) | 2021.08.07 |
[Oracle] ORA-00947 : 값의 수가 충분하지 않습니다. (0) | 2021.08.01 |
[Oracle] 오라클 에러 발생 시 해결방법 (2) | 2021.08.01 |
[Oracle] ORA-01476 : 제수가 0 입니다(divisor is equal to zero) (0) | 2021.07.31 |
댓글