말랑말랑제리스타일

[Oracle] Ora-12704 에러 원인과 대처 방법 본문

데이터베이스/Oracle SQL

[Oracle] Ora-12704 에러 원인과 대처 방법

제리제리 2022. 1. 13. 12:20

Oracle DB에서 UNION, UNION ALL, MINUS 등 집합 연산을 하는 경우 "ORA-12704: 문자 집합이 일치하지 않습니다" 라는 에러가 발생할 수 있습니다.

그럼 이 ORA-12704 에러가 왜 발생하는지 알아보겠습니다.

반응형

  1. ORA-12704 의 발생원인 
    • ORA-12704의 에러 문구에서도 짐작 가능하듯이 집합 연산의 대상이 되는 데이터 타입이 상이한 경우 ORA-12704 에러가 발생합니다.
    • 주로 NVARCHAR2와 VARCHAR2를 집합연산 하는 경우 이 에러를 마주하게 됩니다.
  2. VARCHAR2와 NVARCHAR2의 차이
    1. VARCHAR2는 데이터를 ASCII 코드 형태로 저장하고 NVARCHAR2는 UNICODE 형태로 저장합니다.
    2. 따라서 NVARCHAR2는 기본적으로 CHAR 단위로 할당되고 VARCHAR2는 CHAR로 할당이 가능하나 일반적으로 BYTE 단위로 할당하게 됩니다.
    3. NVARCHAR2는 UNICODE 문자 체계에 대응하기 위한 데이터타입으로 오라클 구버전에서 사용이 불가능합니다.
  3. ORA-01790와의 차이
    • 비슷한 Oracle 에러로 "ORA-01790: 대응하는 식과 같은 데이터 유형이어야 합니다" 에러가 있습니다.
    • 이 에러는 ORA-12704와 마찬가지로 Oracle 집합연산시 데이터 타입이 다른 경우 발생합니다.
    • 단, 차이점은 ORA-12704 에러는 NVARCHAR2와 VARCHAR2를 비교하는 경우에 발생하고 ORA-01790 에러는 Number와 Varchar2 필드를 묶으려고 하는 경우 발생합니다.
  4. 해결방법
    1. 가장 간단한 해결 방법으로 VARCHAR2 데이터타입의 필드에 UNISTR이라는 함수로 필드를 감싸줍니다 
    2. SELECT UNISTR(VARCHAR2_FIELD) AS FNAME FROM TAB1 UNION SELECT NVARCHAR2_FIELD AS FNAME FROM TAB2​
    3. 자주 비교되는 테이블이라면 테이블 구조를 맞춰줍니다. 여기서 영문과 숫자만 있는 필드라면 VARCHAR2로 맞추는걸 권장합니다.
반응형
Comments