CHAR

고정길이 문자열 타입

설정한 크기만큼 데이터가 들어오지 않았을 때 (크기보다 작은 문자열 저장시) 남은 뒷부분은 공백으로 채워짐

 

 

VARCHAR, VARCHAR2

가변길이 문자열 타입

타입의 크기만큼의 데이터가 들어오지 않더라도 나머지가 공백으로 채워지지 않고 문자열 길이만큼 저장

VARCHAR와 VARCHAR2의 차이는 없고 오라클에서는 VARCHAR2를 사용한다.

 

 

EX.

CHAR(5), VARCHAR2(5)으로 5BYTE CHAR, 5BYTE VARCHAR2 문자열타입을 정한뒤에 ABC라는 문자를 입력한다.

ABC 문자열이 저장된 저장공간을 비교해보면 아래와 같다.

 

CHAR : 채워지지 않은 2BYTE 공간은 SPACE(공백)으로 채워져있다. 

A B C SPACE SPACE

 

VARCHAR2 : ABC 3BYTE에 맞는 저장공간이 된다.

A B C

 

CHAR에는 'ABC  ', VARCHAR에는 'ABC'으로 저장된 것이다.

 

 

CREATE TABLE NOTE (EX1 CHAR(5),EX2 VARCHAR(5));
INSERT INTO NOTE VALUES ('ABC', 'ABC');
COMMIT;

오라클 내에서 확인하기 위해 테이블을 생성해서 CHAR(5)타입, VARCHAR(5)타입에 각각 ABC를 INSERT VALUE하였다.

 

 

SELECT * FROM NOTE;

EX1(CHAR)컬럼, EX2(VARCHAR)컬럼에 모두 ABC가 들어간 것을 확인할 수 있다.

 

 

SELECT * FROM NOTE WHERE EX1='ABC'; --ABC데이터 출력O
SELECT * FROM NOTE WHERE EX1='ABC  '; --ABC데이터 출력O
SELECT * FROM NOTE WHERE EX2='ABC'; --ABC데이터 출력O
SELECT * FROM NOTE WHERE EX2='ABC  '; --ABC데이터 출력X

WHERE, =으로 조건을 주었을 때 EX1은 'ABC', 'ABC  ' 검색했을 때 모두 데이터를 확인할 수 있다.

하지만 VARCHAR2타입에서는 'ABC'는 데이터가 확인되지만 'ABC  '으로 찾았을 때는 데이터를 확인할 수 없다.

 

 

 

SELECT DECODE(EX1,'ABC','TRUE','FALSE') FROM NOTE; --FALSE
SELECT DECODE(EX1,'ABC  ','TRUE','FALSE') FROM NOTE; --TURE
SELECT DECODE(EX2,'ABC','TRUE','FALSE') FROM NOTE; --TURE
SELECT DECODE(EX2,'ABC  ','TRUE','FALSE') FROM NOTE; --FALSE

 DECODE로 조건을 주면서 TRUE인지 FALSE인지 확인하였다. EX1은 정확히 'ABC  '와 같고 EX2는 'ABC'와 같다.

 

 

 

SELECT * FROM NOTE WHERE EX1='ABC'; --ABC데이터 출력O
SELECT * FROM NOTE WHERE EX1 like 'ABC'; --ABC데이터 출력X
SELECT DECODE(EX1,'ABC','TRUE','FALSE') FROM NOTE; --FALSE