오라클 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 자료형은 길이가 항상 고정된다는걸 전제로 사용해야 한다. 이를테면 연도나 주민번호같은 경우다.
"데이터베이스" 카테고리의 다른 글
JspMyAdmin - 자바 & 웹기반 MySQL 클라이언트 (0) | 2021.12.26 |
오라클 char, varchar2 칼럼 join시 유의사항 (0) | 2021.12.20 |