Какие системы баз данных поддерживают тип данных ENUM, а какие нет? - PullRequest
10 голосов
/ 03 декабря 2008

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

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

Ответы [ 6 ]

7 голосов
/ 03 декабря 2008

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.

7 голосов
/ 03 декабря 2008

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

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

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

4 голосов
/ 03 декабря 2008

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

2 голосов
/ 08 декабря 2008

В отличие от того, что сказал 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

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

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

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

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

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

1 голос
/ 10 июля 2012

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

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

...