오라클 char, varchar2 칼럼 join시 유의사항

데이터베이스 | 2021.12.20 16:39

오라클 쿼리 작성시 자주 실수하는 부분이 문자열 비교에서 발생한다.
대표적인게 char과 varchar2의 비교인데 자료형에 대한 이해는 누구나 하고 있지만 막상 실무에서 복잡한 쿼리를 작성하다보면 간과하는 경우가 허다하다.
 

CREATE TABLE TBL
(
   TEST_YY CHAR(4),
   TEST_YN VARCHAR2(4),
   TEST_NM VARCHAR2(20)
)
STORAGE (INITIAL 64K NEXT 1024K
TABLESPACE TBL_TS_D;

insert into TBL values ('2021', 'Y', '2021년도 자료');
insert into TBL values ('2022', 'N', '2022');
insert into TBL values ('Y', 'Y', '테스트1');



위와같이 테이블을 생성하고 자료를 insert 한다.
 

select * from TBL 
 where TEST_YY = TEST_YN;

TEST_YY   TEST_YN   TEST_NM
-------   -------   --------

0 rows selected.



char는 고정 문자열 자료형이고 varchar2는 가변 문자열을 저장한다.
char(4) 칼럼은 4byte 이하 문자열을 저장할 수 있는데 'Y' 문자열을 저장하더라도 1byte가 아닌 4byte가 저장된다(고정)
즉, Y 다음에 쓰레기값 3byte가 함께 저장된다.
반면, varchar2(4)의 경우는 'Y'에 1byte로 저장된다(가변)
 

select TEST_YY, LENGTH(TEST_YY), TEST_YN, LENGTH(TEST_YN) 
  from TBL 
 where TEST_YY = 'Y';

TEST_YY   LENGTH(TEST_YY)   TEST_YN   LENGTH(TEST_YN)
-------   ‐--------------   -------   ---------------
Y                      4    Y                      1 

1 row selected.



따라서, 위와 같은 경우는 반드시 trim 따위로 칼럼값을 가공하여 조회해야 정상적인 결과가 나온다.
 

select * 
  from TBL 
 where trim(TEST_YY) = TEST_YN;

TEST_YY   TEST_YN   TEST_NM
-------   -------   -------
Y         Y         테스트1

1 row selected.



반면, 아래와 같은 경우는 자료형은 다르지만 char에 4byte 모두 쓰레기값 없이 저장되어 varchar2 칼럼과 동일하게 비교가 기능해 윈하는 결과가 추출될 것이다.
 

select * 
  from TBL 
 where TEST_YY = TEST_NM;

TEST_YY   TEST_YN   TEST_NM
-------   -------   -------
2021      N         2022

1 row selected.



실무에서 수백, 수천라인의 쿼리를 작성할 때 char와 varchar2 킬럼을 join 하는 경우 이런 문제가 종종 발생하는데 오류찾기가 쉽지않다.
char 자료형은 길이가 항상 고정된다는걸 전제로 사용해야 한다. 이를테면 연도나 주민번호같은 경우다.


"데이터베이스" 카테고리의 다른 글

댓글쓰기

"오라클 char, varchar2 칼럼 join시 유의사항" 의 댓글 (0)