Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 9.0.0 | 

ENUM 데이터 타입

설명

ENUM 타입은 열거형 문자열 상수들로 정의되는 타입이다. ENUM으로 정의된 칼럼의 값은 지정한 문자열 원소만이 허용되며, 열거 원소의 최대 개수는 65535이다. ENUM 타입 칼럼에서 각 값은 열거 원소가 256개 미만이면 1바이트, 256개 이상이면 2바이트로 저장된다. ENUM의 값은 수치형 타입 혹은 문자열 타입이 사용될 수 있다.

ENUM 타입 칼럼은 숫자로 취급하며, 질의에서 비교 대상의 값이 CHAR/VARCHAR인 경우에도 ENUM 타입의 대응되는 색인 번호 숫자 값으로 간주한다.

구문

<enum_type>

    : ENUM '(' <char_string_literal_list> ')'

<char_string_literal_list>

    : <char_string_literal_list> ',' CHAR_STRING

    | CHAR_STRING

예제

다음은 ENUM 칼럼 정의의 예이다.

CREATE TABLE tbl (

    color ENUM('red', 'yellow', 'blue')

);

칼럼 color는 다음 값 중 하나를 가질 수 있다.:

색인 번호

NULL

NULL

'red'

1

'yellow'

2

'blue'

3

다음은 ENUM 칼럼으로 값을 삽입한 예이다.:

INSERT into tbl values ('yellow'), ('red'), (2), ('blue');

다음은 위에서 값을 삽입한 ENUM 칼럼을 조회하는 SELECT 문의 예이다.:

SELECT color FROM tbl;

 

  color

======================

  yellow

  red

  yellow

  blue

 

SELECT color FROM tbl ORDER BY color ASC;

 

  color

======================

  red

  yellow

  yellow

  blue

 

SELECT color FROM tbl ORDER BY cast(color as char) ASC;

 

  color

======================

  blue

  red

  yellow

  yellow

특성
  • 문자열 문맥으로 ENUM 값을 사용하면 문자열을 반환한다. 문자열 문맥으로 사용한 예는 다음과 같다.
  • SELECT CONCAT(enum_col, 'color') FROM tbl_name;

     

      CONCAT(color, '_color')

    ======================

      yellow_color

      red_color

      yellow_color

      blue_color

  • 숫자 문맥으로 ENUM 값을 사용하면 색인 번호를 반환한다. 다음과 같이 ENUM 칼럼에서 숫자 값을 검색할 수 있다.
  • SELECT color + 0 FROM tb;

     

      color + 0

    ======================

      2

      1

      2

      3

  • 문자열과 비교할 때와 숫자가 주어져서 색인 번호에 의해 비교할 때 결과가 다르다. 다음의 예를 살펴보자.
  • -- will use the ENUM index value because it is compared with a number

    SELECT color FROM tbl WHERE color <= 1;

     

      color

    ======================

    red

     

     

    -- will use the ENUM char literal value because it is compared with a CHAR type

    SELECT color FROM tbl WHERE color <= 'red';

     

      color

    ======================

    red

    blue

  • ENUM 타입 칼럼에 대한 인덱스 스캔은 =, IN 연산자에 대해서만 가능하다. 그 외의 비교 연산자는 인덱스 스캔으로 처리되지 않는다.
  • ENUM 타입이 표현하는 범위를 넘는 값은 ENUM 타입으로 변환되지 않고 에러가 발생한다. 에러 데이터를 위한 기본 색인 값(0)과 기본 문자열 값(NULL)으로의 자동 매핑은 지원하지 않는다.
  • ENUM 타입 칼럼에 값을 입력할 때 삽입하는 숫자를 작은 따옴표로 감싸면, 그 값이 열거 원소 목록에 존재하는 경우 문자열 값으로 해석하고, 그렇지 않으면 색인 번호로 해석한다. 따라서 혼동을 피하기 위해 열거 원소 값으로 숫자와 비슷한 값은 피하는 것을 권장한다. ENUM 타입 칼럼에 숫자와 비슷한 열거 원소 값을 입력한 경우의 예는 다음과 같다.

    CREATE TABLE tb2 (nums enum('0', '1', '2'));

    INSERT INTO tb2 (nums) VALUES(1),('1'),('3');

    SELECT * FROM tb2;

     

      nums

    ======================

      0

      1

      2

    • 작은 따옴표로 감싸지 않은 1을 입력하면 색인 번호 1에 해당하는 열거 원소 값인 '0'이 삽입된다.
    • '1'을 입력하면 일치하는 열거 원소 값이 존재하므로 '1' 값이 삽입된다.
    • '3'을 입력하면 일치하는 열거 원소 값이 존재하지 않으며 3은 유효한 색인 번호이므로 색인 번호 3에 해당하는 열거 원소 값인 '2'가 삽입된다.
  • ENUM 값은 원소의 문자열 값이 아니라 색인 번호에 의해 정렬된다. NULL 값은 모든 문자열보다 앞에 정렬되며, 공백 문자열은 다른 모든 문자열보다 앞에 정렬된다. ENUM 타입 칼럼에서 원소를 알파벳 순서로 정렬하려면 다음과 같이 CAST 함수를 사용한다.
  • SELECT color FROM tb ORDER BY cast(color as char) ASC;

  • ENUM 타입을 다른 타입으로 변환할 때에는 어떤 타입으로 변환하는지에 따라 ENUM 타입의 색인 번호 또는 문자열이 변환된다. 아래 표에서 앞에 별표(*)가 있는 타입은 해당 타입에서 ENUM 타입으로 변환할 수도 있음을 의미한다.

타입

값(색인 번호/문자열)

*SHORT

색인 번호

*INTEGER

색인 번호

*BIGINT

색인 번호

*FLOAT

색인 번호

*DOUBLE

색인 번호

*NUMERIC

색인 번호

*MONETARY

색인 번호

*TIME

문자열

*DATE

문자열

*DATETIME

문자열

*TIMESTAMP

문자열

*CHAR

문자열

*VARCHAR

문자열

BIT

문자열

VARBIT

문자열

참고 사항
  • ENUM 칼럼에서 입력 가능한 모든 값을 확인하고 싶다면, SHOW COLUMNS를 사용한다.
  • ENUM 값은 원소의 열거 순서에 따라 색인 번호를 갖는다. 원소 색인 번호는 1부터 시작한다.
  • 공백 문자열도 사용자가 명시적으로 지정하여 일반적인 색인 번호가 있는 경우 정상적인 열거 원소 값으로 사용된다.
  • 사용자가 지정하지 않은 경우 공백 문자열은 색인 번호가 0에 해당한다. 이런 공백 문자열을 가진 행을 찾기 위해 다음과 같은 문장을 사용할 수 있다.
  • SELECT * FROM tb WHERE color=0;

  • NULL을 허용하도록 선언된 ENUM 칼럼에서 NULL에 대한 색인 번호 값은 NULL이다.
  • NULL을 허용한 칼럼의 기본값은 NULL이며, NOT NULL인 경우 칼럼의 기본값은 칼럼을 정의할 때 지정한 ENUM 리스트의 첫 번째 원소이다.
  • 테이블이 생성되면 ENUM 칼럼의 모든 원소의 후행 공백(trailing blank)은 자동으로 제거된다.
  • ENUM 원소의 대소문자는 바뀌지 않고 칼럼을 정의할 때 명시한 대소문자가 그대로 유지된다.
  • 타입1과 타입2를 피연산자로 하는 연산에서 결과 타입은 다음과 같다. 다음 규칙의 예외는 ENUM 칼럼을 상수 값과 비교할 때로, 이때 상수 값은 같은 타입의 ENUM 값으로 바뀐다.

타입1

타입2

결과 타입

SHORT

ENUM

SHORT

INTEGER

ENUM

INTEGER

BIGINT

ENUM

BIGINT

FLOAT

ENUM

FLOAT

DOUBLE

ENUM

DOUBLE

NUMERIC

ENUM

NUMERIC

MONETARY

ENUM

MONETARY

TIME

ENUM

TIME

DATE

ENUM

DATE

DATETIME

ENUM

DATETIME

TIMESTAMP

ENUM

TIMESTAMP

CHAR

ENUM

CHAR

VARCHAR

ENUM

VARCHAR

드라이버 수준에서 ENUM 타입 사용

ENUM 타입이 JDBC, CCI 등 각종 드라이버에 특별하게 매핑되지 않는다. 따라서 응용 개발자는 STRING 타입을 사용하는 것처럼 사용하면 된다. 다음은 JDBC 응용의 예이다.

Statement stmt = connection.createStatement(“SELECT color FROM tbl”);

ResultSet rs = stmt.executeQuery();

while(rs.next()){

   System.out.println(rs.getString());

}

다음은 CCI 응용의 예이다.

req_id = cci_prepare (conn, “SELECT color FROM tbl”, 0, &err);

error = cci_execute (req_id, 0, 0, &err);

if (error < CCI_ER_NO_ERROR)

{

    /* handle error */

}

error = cci_cursor (req_id, 1, CCI_CURSOR_CURRENT, &err);

if (error < CCI_ER_NO_ERROR)

{

    /* handle error */

}

error = cci_fetch (req_id, &err);

if (error < CCI_ER_NO_ERROR)

{

    /* handle error */

}

cci_get_data (req, idx, CCI_A_TYPE_STR, &data, 1);

제약 사항
  • ENUM 타입 칼럼에는 DEFALUT 값을 지정할 수 없다.
  • ENUM 값에 표현식은 사용할 수 없다. 예를 들어, 다음과 같은 CREATE TABLE 문은 에러를 생성한다.

    CREATE TABLE tb (

        color ENUM('red', CONCAT('light ','gray'), 'blue')

    );