Какие системы баз данных поддерживают тип данных 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
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.