DB/SQL - Oracle

[SQL] 문자(열) 데이터 타입 - char, varchar, varchar2

생각많은 프로그래머 2024. 1. 21. 20:36

 

char, varchar, varchar2는 데이터베이스에서

문자(열)을 저장하는 데 사용되는 데이터 속성이다.

문자형 데이터라고도 말한다.

세 가지 모두 ANSI SQL 표준에 따라 정의된 데이터 유형으로

주로 SQL 데이터베이스 시스템에서 사용된다.

 

문자(열) 데이터 타입에는 위 3가지 말고도

nchar, nvarchar2, long이 있는데 자주 사용하지 않으므로

이번 글에서는 생략하고자 한다.

 

 

먼저 알아둘 점은 한글은 한 글자당 2byte,

영문과 숫자는 한 글자당 1byte를 차지한다는 점이다.

(참고로 UTF-8에서 한글은 한 글자당 3byte를 차지한다.)

 

문자열을 DB에 저장할 때는 위 3가지의 속성의 특징과 더불어

정의된 필드에 최대 몇 바이트까지 저장 가능하도록 정의하는 것이 적절한지

고민한 후에 테이블을 정의할 필요가 있다.

 

 

 

먼저 각각의 특징에 대해 살펴보자. 

 

  1. char
    • 고정 길이 문자열을 저장하는 데 사용
    • 데이터 길이 제한이 최대 2,000byte, 디폴트 값은 1byte
    • 디폴트 값이 1byte이므로 char(10)이면 10뒤에 byte를 명시하지 않아도 byte로 인식한다.
    • 지정된 길이보다 짧은 문자열을 저장할 경우 나머지 공간을 공백으로 채운다.
    • 예를 들어, 속성이 char(10)이고 "CAR"를 저장했다면 3byte에 해당하므로
      남은 7 byte 를 공백이 채우게 된다. 결과적으로 이 컬럼의 길이는 10 byte 가 된다.
    • 계속해서 저장할 값의 크기가 10 byte 보다 더 작다면 저장 공간을 낭비하게 될 수 있다.
  2. varchar
    • 가변 길이 문자열을 저장하는 데 사용
    • 데이터 길이 제한이 최대 4,000 byte (Oracle 12c 이전) 또는
      32,767 byte (Oracle 12c 이후), 디폴트 값은 1 byte
    • 문자열의 실제 길이만큼 저장 공간을 할당하므로 저장 공간을 절약할 수 있다.
    • 결과적으로 실제 길이만큼 바이트수가 할당된다. "CAR"라면 3 byte 가 이 컬럼의 길이이다.
      (varchar2도 같음)
  3. varchar2
    • 가변 길이 문자열을 저장하는 데 사용
    • 데이터 길이 제한이 최대 4,000 byte (Oracle 12c 이전) 또는
      32,767 byte (Oracle 12c 이후), 디폴트 값은 1 byte
    • Oracle에서 독자적으로 도입한 데이터 유형으로, VARCHAR를 확장하고 개선한 유형
    • 문자열의 실제 길이만큼 저장 공간을 할당하므로 저장 공간을 절약할 수 있다.

 

 

이러한 차이점들을 고려하여, 데이터베이스에서 문자열을 저장할 때

고정된 길이의 문자열이 필요한 경우 char를 사용하고,

가변 길이의 문자열이 필요한 경우 varchar 또는 varchar2를 사용하는 것이 일반적이다.

 

나의 경우 varchar보다는 varchar2를 더 자주 사용하는 이유는,

일단 Oracle에서 varchar2 를 사용하도록 권장하고 있고

공식적으로 지원되는 데이터 유형이라 그렇다.

또한  varchar2는 ANSI/ISO SQL 표준과 더 잘 호환되므로

다른 시스템과의 통합에 용이하다는 이점이 있어서

굳이 하나를 골라야 한다면 varchar2를 사용한다.

 

 

* 디폴트 값은 byte와 관련하여 한 가지 유의할 점이 더 있다.

   아래 예시를 보자. 

create table example(
col01 varchar2(3),
col02 varchar2(3 byte),
col03 varchar2(3 char)
);

 

이 예시에서 보면 각 컬럼마다 똑같이 varchar2를 데이터 타입으로 지정했지만

괄호 안에 입력한 값이 서로 다르다.

이렇게 컬럼을 정의하면 어떤 차이점이 있을까?

 

만약 아래 insert 문으로 튜플을 삽입한다면, 오류가 발생할 것이다. 

insert into example values('홍길동', '홍길동', '홍길동');

 

 

 

한글은 한 글자당 2byte의 크기를 가진다. 

따라서 col01 컬럼과 col02 컬럼에는 모두 최대 3byte까지만 입력 가능하나,

위 insert문에서는 '홍길동'이라는 6byte 크기의 문자열을

insert하려고 했으니 오류가 발생하는 것이다.

 

반면, col03 컬럼에는 '홍길동'을 삽입하는 데 문제가 없다.

byte가 아니라 char로 명시했기 때문에 글자수가 최대 3글자까지

저장될 수 있으므로 '홍길동'을 삽입할 수 있는 것이다. 

 

이 특징을 잘 기억해두면 추후 한글로 된 긴 문장의 데이터를 삽입해야 할 경우에

글자수 제한을 두려고 할 때 매번 바이트수를 계산할 필요없이

글자수만 생각해서 (글자수 char) 로 컬럼을 정의하면 간편하다.