수색…


왜 ENUM인가?

ENUM은 행에 대한 속성을 제공하는 방법을 제공합니다. 적은 수의 비 숫자 옵션이있는 속성이 가장 잘 작동합니다. 예 :

reply ENUM('yes', 'no')
gender ENUM('male', 'female', 'other', 'decline-to-state')

값은 문자열입니다.

INSERT ... VALUES ('yes', 'female')
SELECT ... --> yes female

대안으로 TINYINT

우리가 가지고 있다고 가정 해 봅시다.

type ENUM('fish','mammal','bird')

대안은

type TINYINT UNSIGNED

...을 더한

CREATE TABLE AnimalTypes (
    type TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL  COMMENT "('fish','mammal','bird')",
    PRIMARY KEY(type),
    INDEX(name)
) ENGINE=InnoDB

이것은 many-to-many 테이블과 매우 흡사하다.

비교, 그리고 ENUM보다 좋든 나쁘 든 :

  • (더 나쁜) INSERT : type 찾아야 type
  • (더 나쁜) SELECT : 문자열을 얻으려면 JOIN해야합니다 (ENUM은 노력없이 문자열을 제공합니다)
  • (더 좋음) 새로운 유형 추가 :이 표에 삽입하기 만하면됩니다. ENUM을 사용하면 ALTER TABLE을 수행해야합니다.
  • (동일) 어느 기술 (최대 255 값)은 1 바이트 만 사용합니다.
  • (혼합) 데이터 무결성의 문제도 있습니다 : TINYINT 는 유효하지 않은 값을 허용합니다. ENUM 은 특수한 빈 문자열 값으로 설정합니다 (엄격한 SQL 모드가 활성화되어 있지 않은 경우 거부됩니다). 룩업 테이블에 외래 키를 만들어 TINYINT 를 통해 데이터 무결성을 향상시킬 수 있습니다. 적절한 쿼리 / 조인을 사용하지만 다른 테이블에 도달하는 데 드는 비용은 여전히 ​​적습니다. ( FOREIGN KEYs 는 무료가 아닙니다.)

대안으로 VARCHAR

우리가 가지고 있다고 가정 해 봅시다.

type ENUM('fish','mammal','bird')

대안은

type VARCHAR(20)  COMENT "fish, bird, etc"

이것은 새로운 유형이 사소하게 추가된다는 점에서 완전히 개방적입니다.

비교, 그리고 ENUM보다 좋든 나쁘 든 :

  • (같은) INSERT : 단순히 문자열을 제공한다.
  • (더 나빠?) INSERT시 오타가 눈에 띄지 않게됩니다.
  • (동일한) SELECT : 실제 문자열이 반환됩니다.
  • (더 나쁜) 더 많은 공간이 소비됩니다.

새 옵션 추가

ALTER TABLE tbl MODIFY COLUMN type ENUM('fish','mammal','bird','insect');

노트

  • MODIFY COLUMN의 모든 경우와 마찬가지로 NOT NULL 과 원래 존재했던 다른 한정자를 포함시켜야합니다. 그렇지 않으면 손실됩니다.
  • 이 목록의 끝에 추가하고 목록 256 개 항목 아래의 경우, ALTER 단순히 스키마를 변경하여 수행됩니다. 테이블 사본이 길어지지 않습니다. (구 버전의 MySQL에는 이러한 최적화가 없었습니다.)

NULL 대 NOT NULL

NULL 및 'bad-value'가 Null 허용 및 Null 허용 열에 저장 될 때 발생하는 예제 또한 +0 통해 숫자로 형변환의 사용법을 보여줍니다.

CREATE TABLE enum (
    e     ENUM('yes', 'no')   NOT NULL,
    enull ENUM('x', 'y', 'z')     NULL
        );
INSERT INTO enum (e, enull)
    VALUES
        ('yes', 'x'),
        ('no',  'y'),
        (NULL,  NULL),
        ('bad-value', 'bad-value');
Query OK, 4 rows affected, 3 warnings (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 3

mysql>SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1048 | Column 'e' cannot be null                  | 
| Warning | 1265 | Data truncated for column 'e' at row 4     |
| Warning | 1265 | Data truncated for column 'enull' at row 4 |
+---------+------+--------------------------------------------+
3 rows in set (0.00 sec)

삽입 후 테이블에 무엇이 있습니까? 이것은 "+0"을 사용하여 숫자로 변환하여 저장된 내용을 봅니다.

mysql>SELECT e, e+0 FROM enum;
+-----+-----+
| e   | e+0 |
+-----+-----+
| yes |   1 |
| no  |   2 |
|     |   0 |  -- NULL
|     |   0 |  -- 'bad-value'
+-----+-----+
4 rows in set (0.00 sec)

mysql>SELECT enull, enull+0 FROM enum;
+-------+---------+
| enull | enull+0 |
+-------+---------+
| x     |       1 |
| y     |       2 |
| NULL  |    NULL |
|       |       0 |  -- 'bad-value'
+-------+---------+
4 rows in set (0.00 sec)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow