336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

오라클에서 문자타입을 사용 하다 보면 CHAR, VARCHAR, VARCHAR2를 보실수 있습니다.

처음에는 아무생각 없이 쓰다가 어느순간 문제가 발생 해 검색을 하는 경우가 생길 거라 생각이 듭니다.

그 순간 이 포스팅을 보시고, 도움이 되셨으면 좋겠습니다.

(완전 완벽히 자세히 알려드리지는 못할 수 있지만 사용하는데 최대한 지장이 없도록 열심히 작성하였습니다!)

 

우선 간단하게 비교표를 보면,

 

CHAR는 고정형이고, VARCHAR는 가변형이라고 적혀있습니다.

고정형은 말그대로 고정적일때 사용해야 하고, 가변형은 변화가 있는 컬럼에 대해 사용해야 한다는 것입니다.

이 말이 처음에는 먼가 하실 수 있습니다.

(저도.. 그랬습니다.. 심지어 처음 배웠을때는 아 그런가보다 하고 넘겼던 것 같습니다..)

그래서 이해를 돕기 위해 예제를 한번 만들어봤습니다.

 

CREATE TABLE TEST_CHARACTER(
 T_CHAR CHAR(4),
 T_VARCHAR VARCHAR(4),
 T_VARCHAR2 VARCHAR2(4) 
);

 

INSERT INTO TEST_CHARACTER VALUES('A', 'A', 'A'); 

 

테스트 테이블을 만들고, 각각 CHAR, VARCHAR, VARCHAR2 문자형을 가지는 컬럼에 똑같은 문자 A를 넣습니다.

 

 

이 상태에서 고정형과 가변형의 차이를 볼 수 있게 셀렉트를 해보겠습니다.

 

SELECT  DECODE(T_CHAR, 'A   ', 'TRUE', 'FALSE')         T_CHAR,
           DECODE(T_VARCHAR, 'A   ', 'TRUE', 'FALSE')    T_VARCHAR,
           DECODE(T_VARCHAR2, 'A   ', 'TRUE', 'FALSE')  T_VARCHAR2
FROM   TEST_CHARACTER;

 

※ 참고로 DECODE 함수는 IF문 같은 함수입니다. DECODE(컬럼, '비교값', '같으면 요기', '다르면 요기') 

위와 같이 셀렉트를 하면 아래와 같은 결과가 나옵니다.

 

 

간략하게 설명을 드리면,

비교값의 문자는 'A∨∨∨' (A공백백공백) 입니다.

공백이 포함되자 CHAR 같은 경우에는 TRUE가 나왔고, VARCHAR나 VARCHAR2는 FALSE가 나왔습니다.

VARCHAR나 VARCHAR2 같은 경우에는 우선 같다고 보고 CHAR와 VARCHAR를 비교해서 설명해드리겠습니다.

 

CHAR 같은경우에는 4byte로 공간을 잡았는데, 문자가 4byte가 다 안채워지면 나머지가 공백으로 채워지도록 되어 있습니다.

그렇기 때문에 나는 분명히 A 라는 문자를 넣었는데, 자동적으로 'A∨∨∨' 가 되어 공백을 집어넣어야 TRUE 가 되는 것을 볼 수 있습니다.

이런 의미로 고정형이라는 말이 쓰이는 것입니다. 왜냐면 공백이 채워지지 않게 하기위에선 할당한 공간을 꽉채워야 하기 때문입니다.

예를들어 형식을 정한 날짜라던지 주민등록번호 처럼 절대 글자수가 변화가 되지 않는 경우에 사용하면 적당하다고 볼 수 있습니다.

(하지만 일반적으로는 VARCHAR로 공백을 생각치 않고 쓰는 경우가 많은것 같습니다.)

 

반면 VARCHAR는 4byte를 할당하고 'A'라는 1byte의 문자를 입력하면 CHAR와는 다르게 공백이 채워지는것이 아니라 입력한 부분만 쓰입니다.

이런 의미로 가변형이라는 말이 쓰이는 것입니다. 왜냐면 할당한 영역은 4byte 지만 나는 꼭 4byte를 쓰지 않고 매번 다를 수도 있기 때문입니다.

예를들어 아이디라는 컬럼이 있으면 그 컬럼은 매번 다른 수의 글자가 입력이 될 것입니다. 그럼에도 공백이 채워지지 않기에,

걱정없이 컬럼을 사용 할 수가 있으니 글자수의 변화가 있는 경우에 사용하면 적당하다고 볼 수 있습니다.

아 그리고, 반대로 'A'문자를 비교했을때를 궁금해하실 수 있으니 보고 가겠습니다.

 

SELECT  DECODE(T_CHAR, 'A', 'TRUE', 'FALSE')         T_CHAR,
           DECODE(T_VARCHAR, 'A', 'TRUE', 'FALSE')    T_VARCHAR,
           DECODE(T_VARCHAR2, 'A', 'TRUE', 'FALSE')  T_VARCHAR2
FROM  TEST_CHARACTER; 

 

위와 같이 셀렉트를 하면 아래와 같은 결과가 나옵니다.

 

 

결과는, 반대로 CHAR만 FALSE가 나오는 것을 볼 수 있습니다.

그러니까, CHAR형태로 컬럼을 만들고 할당 영역을 꽉채우는 데이터가 아니라면, 내가 넣었을땐 'A'라는 문자를 입력했더라도, 조건으로 아무리 비교해봐야 내가 원하는 결과가 나올 수가 없다는 것입니다.

 

다음으로 위에 적혀있는 BYTE수는 데이터 길이 제한의미합니다. (CHAR : 2000byte / VARCHAR, VARCHAR2 : 4000byte)

그리고 VARCHAR와 VARCHAR2 같은경우에는 현재는 차이가 없으나, 오라클쪽에서 추후에 VARCHAR 같은경우에는 다른 형태로 쓰일 수 있다고 합니다.

그렇기 때문에 오라클에서는 VARCHAR보다는 VARCHAR2를 쓰는것을 권장한다고 합니다.

(이 내용은 Oracle10g 어느 문서에 적혀있다고 합니다...)

 

 

그래서 최종결론은!!!

 

§ CHAR는 문자의 길이가 고정적일때 사용하고!!!

§ VARCHAR는 문자의 길이가 변화가 있을때 사용하고!!!

§ 오라클에서는 VARCHAR보다 VARCHAR2를 쓰는 것을 권장한다!!!

 

 

※ 아 참고로... 오라클 기준에 설명 드렸습니다.. 다른 DB도 어느정도 일치하나.. 그렇다고 또 완전히 디테일하게 맞지는 않으니.. 참고하시기 바랍니다..ㅎ

+ Recent posts