더북(TheBook)

데이터 타입

데이터 타입(Datatype)이란 컬럼이 저장되는 데이터 유형을 말하며, 오라클에서는 기본으로 제공되는 기본 데이터 타입(원시 데이터 타입이라고도 함)과 사용자 정의 데이터 타입으로 구분할 수 있다. 사용자 정의 타입이란 여러분과 같은 사용자가 직접 기본 테이터 타입을 혼합해 만들 수 있는 타입인데 이 책에서는 기본 데이터 타입에 대해서만 다루도록 하겠다.

문자 데이터 타입

문자나 문자열 데이터는 문자형 데이터에 속하며, 오라클에서 제공하는 문자형은 다음과 같다.

표 2-2 문자 데이터 타입
데이터 타입 설명
CHAR (크기[ BYTE | CHAR ]) 고정길이 문자, 최대 2000byte, 디폴트 값은 1byte
VARCARCHAR2 (크기[ BYTE | CHAR ]) 가변길이 문자, 최대 4000byte, 디폴트 값은 1byte
NCHAR (크기) 고정길이 유니코드 문자(다국어 입력 가능), 최대 2000byte, 디폴트 값은 1
NVARCARCHAR2 (크기) 가변길이 유니코드 문자(다국어 입력 가능), 최대 4000byte, 디폴트 값은 1
LONG 최대 2GB 크기의 가변길이 문자형, 잘 사용하지 않음

[표 2-2]에서 가변길이라 함은 실제 입력된 데이터 길이에 따라 크기가 변해 정해지는 것을 말한다. 예를 들어, 특정 컬럼을 VARCHAR2(10)으로 선언하면, 10byte까지 데이터를 입력할 수 있다. 그런데 이 컬럼에 ‘bac’라고 세 글자만 입력하면 실제 컬럼 길이는 3byte가 된다. 반면 고정길이 CHAR(10)으로 만든 후 ‘bac’라고 입력하면 세 문자만 입력됐더라도 이 컬럼 길이는 10byte가 된다. 실제로 확인해 보자.

입력

    INSERT INTO ex2_1 ( column1, column2 ) VALUES ('abc', 'abc');

    SELECT column1, LENGTH(column1) as len1,
            column2, LENGTH(column2) as len2
      FROM ex2_1;

결과

    COLUMN1      LEN1     COLUMN2        LEN2
    ------------ -------- -------------- ----------
    abc          10       abc            3

뒤에서 자세히 다루겠지만 LENGTH란 컬럼 길이를 반환하는 SQL 함수다. 결과를 보면 같은 값을 입력했지만 CHAR 타입은 길이가 3이 아닌 10임을 알 수 있다. SQL을 작성하고 사용하는 측면에서 CHAR VARCHAR2 타입은 실질적 차이가 없으므로 문자형 컬럼은 저장 공간 효율화를 위해 CHAR보다는 VARCHAR2를 사용하자.

그리고 NCHAR와 NVARCHAR2는 유니코드 문자형으로 다국어 입력이 가능하다. LONG형은 숫자가 아닌 문자 데이터 타입으로, 오라클에서는 LONG 타입을 더는 사용하지 않도록 권고하고 있다. 이 타입은 CLOB나 BLOB로 대체할 수 있으며, 하위 버전 호환성을 이유로 11g에서도 지원하고 있는 것이다.

컬럼 타입을 선언할 때 크기(숫자)만 명시하면 디폴트 값인 byte가 적용된다. 여기서 한 가지 주의해야 할 내용이 있는데, 영어에서 한 문자는 1byte를, 한글은 2byte를 차지한다.

입력

    CREATE TABLE ex2_2 (
        COLUMN1    VARCHAR2(3), → 디폴트 값인 byte 적용
        COLUMN2    VARCHAR2(3 byte),
        COLUMN3    VARCHAR2(3 char)
    );

결과

    table EX2_2이(가) 생성되었습니다.

입력

    INSERT INTO ex2_2 VALUES ('abc', 'abc', 'abc');

    SELECT column1, LENGTH(column1) AS len1,
            column2, LENGTH(column2) AS len2,
            column3, LENGTH(column3) AS len3
      FROM ex2_2;

결과

    COLUMN1 LEN1 COLUMN2 LEN2 COLUMN3 LEN3
    ------- ---- ------- ---- ------- ----
    abc        3     abc    3     abc    3

영문자는 크기가 모두 3byte다. 이제 한글을 입력해 보자.

입력

    INSERT INTO ex2_2 VALUES ('홍길동', 홍길동', '홍길동');

결과

    SQL 오류: ORA-12899: "ORA_USER"."EX4_2"."COLUMN1" 열에 대한 값이 너무 큼(실제: 6, 최대값: 3)

한글은 한 글자가 2byte이므로 column1에 입력할 때 오류가 발생했다. 하지만 column3에서는 byte가 아닌 char를 명시했기 때문에 입력할 수 있다.

입력

    INSERT INTO ex2_2 (column3) VALUES ('홍길동');

결과

    1개 행 이(가) 삽입되었습니다.

입력

    SELECT column3, LENGTH(column3) AS len3, LENGTHB(column3) AS bytelen
      FROM ex2_2;

결과

    COLUMN3      LEN3       BYTELEN
    ------------ ---------- ----------
    abc          3          3
    홍길동       3          6

LENGTHB는 해당 컬럼의 byte 수를 반환하는 함수로, 위 결과를 보면 한글은 2byte이므로 총 6byte를 차지했음을 알 수 있다. 사실 한글 한 문자가 무조건 2byte인 것은 아니며 DB설정에 따라 3byte를 차지하기도 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.