Какие системы баз данных поддерживают тип данных ENUM, а какие нет?

Следуя этому вопросу: "Перечисления баз данных - плюсы и минусы", я хотел бы знать, какие системы баз данных поддерживают типы данных перечисления, и немного подробнее о том, как они это делают (например, что хранится внутри, каковы ограничения, последствия синтаксиса запроса, значения индексации, ...).

Обсуждение вариантов использования или плюсов и минусов должно происходить в других вопросах.

6 ответов

PostgreSQL поддерживает ENUM начиная с 8.3. Для более старых версий вы можете использовать:

Вы можете смоделировать ENUM, выполнив что-то вроде этого:

CREATE TABLE persons (
  person_id int not null primary key,
  favourite_colour varchar(255) NOT NULL,
  CHECK (favourite_colour IN ('red', 'blue', 'yellow', 'purple'))
);

Вы также можете иметь:

CREATE TABLE colours (
  colour_id int not null primary key,
  colour varchar(255) not null
)
CREATE TABLE persons (
  person_id int not null primary key,
  favourite_colour_id integer NOT NULL references colours(colour_id),
);

что позволит вам добавить соединение, когда вы узнаете любимый цвет, но имеет то преимущество, что вы можете добавлять цвета, просто добавляя запись в таблицу цветов, а не то, что вам не нужно будет каждый раз менять схему. Вы также можете добавить атрибут к цвету, например, HTML-код или значения RVB.

Вы также можете создать свой собственный тип, который выполняет перечисление, но я не думаю, что это будет быстрее, чем varchar и CHECK,

Я знаю, что MySQL поддерживает ENUM:

  • тип данных реализован как целочисленное значение со связанными строками
  • Вы можете иметь максимум 65.535 элементов для одного перечисления
  • каждая строка имеет числовой эквивалент, считая от 1, в порядке определения
  • числовое значение поля доступно черезSELECT enum_col+0"
  • в нестрогом режиме SQL назначение значений, отсутствующих в списке, не обязательно приводит к ошибке, а вместо этого присваивается специальное значение ошибки, имеющее числовое значение 0
  • сортировка происходит в числовом порядке (например, в порядке определения), а не в алфавитном порядке строковых эквивалентов
  • присваивание либо работает через строку значений или индексный номер
  • этот: ENUM('0','1','2') следует избегать, потому что '0' будет иметь целочисленное значение 1

Oracle вообще не поддерживает ENUM.

AFAIK, ни IBM DB2, ни IBM Informix Dynamic Server не поддерживают типы ENUM.

В отличие от того, что сказал mat, PostgreSQL поддерживает ENUM (начиная с последней версии 8.3):

essais=> CREATE TYPE rcount AS ENUM (
essais(>   'one',
essais(>   'two',
essais(>   'three'
essais(> );
CREATE TYPE
essais=> 
essais=> CREATE TABLE dummy (id SERIAL, num rcount);
NOTICE:  CREATE TABLE will create implicit sequence "dummy_id_seq" for serial column "dummy.id"
CREATE TABLE
essais=> INSERT INTO dummy (num) VALUES ('one');
INSERT 0 1
essais=> INSERT INTO dummy (num) VALUES ('three');
INSERT 0 1
essais=> INSERT INTO dummy (num) VALUES ('four');
ERROR:  invalid input value for enum rcount: "four"
essais=> 
essais=> SELECT * FROM dummy WHERE num='three';
 id |  num  
----+-------
  2 | three
  4 | three

Есть функции, которые работают специально с перечислениями.

Индексирование прекрасно работает для перечислимых типов.

Согласно руководству, реализация выглядит следующим образом:

Значение enum занимает четыре байта на диске. Длина текстовой метки значения перечисления ограничена настройкой NAMEDATALEN, скомпилированной в PostgreSQL; в стандартных сборках это означает максимум 63 байта.

Метки enum чувствительны к регистру, поэтому "happy" - это не то же самое, что "HAPPY". Пробелы в метках тоже значительны.

MSSQL не поддерживает ENUM.

При использовании Entity Framework 5 вы можете использовать перечисления (см. Раздел Поддержка перечислений в Entity Framework и пошаговое руководство по типам перечислений EF5), но даже в этом случае значения сохраняются в базе данных как int.

Другие вопросы по тегам