애옹이

[Oracle] CHAR, VARCHAR, VARCHAR2 차이 본문

DataBase/Oracle

[Oracle] CHAR, VARCHAR, VARCHAR2 차이

cat1005 2020. 9. 1. 10:49

데이터베이스 데이터 유형 및 CHAR와 VARCHAR 비교

데이터 유형은 데이터베이스의 테이블에 특정 자료를 입력할 때,

그 자료를 받아들일 공간을 자료의 유형별로 나누는 기준이다.

 

따라서 선언한 유형이 아닌 다른 종류의 데이터가 들어오려고 하면

데이터베이스는 에러를 발생시킨다.

 

데이터베이스의 데이터 유형은 Oracle, MySQL 등 응용프로그램마다 조금씩 다른 형태로 제공된다.

숫자 타입을 예로 NUMERIC type의 하위 개념으로 NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT, BIGINT, FLOAT, REAL, DOUBLE 등이 있다.

하지만 Oracle은 숫자형 타입에 대해서 NUMBER 한 가지 숫자 타입의 데이터 유형만 지원한다.

 

아래는 데이터 유형의 대표적인 4가지이다.

 

 데이터 유형

설 명 

CHAR(s) 

- 고정 길이 문자열 정보

- s는 기본 길이 1바이트, 최대 길이 Oracle 2000바이트 SQL Server 8000바이트 

- s만큼 최대 길이를 갖고 고정 길이를 가지고 있으므로 할당도니 변수 값의 길이가 s보다 작을 경우에는 그 차이 길이만큼 공간으로 채워진다.

VARCHAR(2) 

- CHARACTER VARYING의 약자로 가변 길이 문자열 정보(Oracle은 VARCHAR2 로 표현, SQL Server는 VARCHAR로 표현)

- s는 최소 길이 1바이트, 최대 길이 Oracle 4000바이트, SQL Server 8000 바이트

- s만큼의 최대 길이를 갖지만 가변 길이로 조정이 되기 때문에 할당된 변수값의 바이트만 적용된다. 

NUMERIC 

- 정수, 실수 등 숫자 정보 (Oracle은 NUMBER로, SQL Server는 다양한 숫자 타입 지원)

- Oracle은 처음에 전체 자리 수를 지정하고, 그 다음 소수 부분의 자리 수를 지정한다.

ex> 정수 부분이 6자리이고 소수점 부분이 2자리인 경우 NUMBER(8,2) 

DATE

- 날짜와 시각 정보

- Oracle은 1초 단위, SQL Server는 3.33ms(millisecond) 단위 관리 


* CHAR와 VARCHAR (VARCHAR2)의 비교

 

문자의 경우 CHAR와 VARCHAR의 차이는 저장 영역과 문자열의 비교 방법이다.

VARCHAR 유형은 가변 길이이므로 필요한 영역은 실제 데이터 크기뿐이다. 그렇기 때문에 길이가 다양한 컬럼과, 정의된 길이와 실제 데이터 길이에 차이가 있는 컬럼에 적합하다.

저장 측면에서도 CHAR 유형보다 작은 영역에 저장할 수 있으므로 장점이 있다.

 

비교 방법에서도 차이가 있다.

CHAR 에서는 문자열을 비교할 때 공백을 채워서 비교하는 방법을 사용한다. CHAR(8) 이고 'AA'가 저장되어 있다면, 'AA' 뒤에 공백 6자리를 붙여 8자리로 비교하는 것이다.

따라서  'AA' = 'AA  ' 은 실제로 'AA      ' = 'AA      ' 가 되어 같다는 결과가 나온다.

 

반면에 VARCHAR 에서는 공백도 하나의 문자로 취급하므로 끝에 공백이 들어가면 다른 문자로 판단한다.

같은 예로 들면 'AA' != 'AA '  로 공백이 있어 서로 다른 문자로 판단한다.

 

따라서 이름, 주소 등의 길이가 변할 수 있는 값VARCHAR를 사용하고,

사번, 주민등록번호와 같이 길이가 일정한 데이터CHAR를 사용하는게 좋다. 

 

더불어 오라클에서는 VARCHAR는 추후 별도의 데이터유형으로 사용할 예정이기에 

VARCHAR2를 사용하는 것을 권장하고 있다.



출처: https://hyeonstorage.tistory.com/290 [개발이 하고 싶어요]

'DataBase > Oracle' 카테고리의 다른 글

[ Oracle ] 설치후 계정 부여 및 활성화  (0) 2020.09.21
[ Database ] Naming Rule  (0) 2020.09.01