2008-12-03 1 views
10

В ответ на этот вопрос: «Database enums - pros and cons», я хотел бы знать, какие системы баз данных поддерживают типы данных перечисления и немного подробно о том, как они это делают (например, что хранится внутри, каковы ограничения, синтаксические последствия запроса , индексирование последствий, ...).Какие системы баз данных поддерживают тип данных ENUM, а какие нет?

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

ответ

4

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

8

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

  • тип данных реализован в виде целочисленного значения с соответствующими строками
  • вы можете иметь максимум 65,535 элементов для одного перечисления
  • каждая строка имеет численный эквивалент, считая от 1, в порядке определения
  • числовое значение поля доступно через «SELECT enum_col+0»
  • в не-str ict SQL, присваивание значений не в списке не обязательно приводит к ошибке, но вместо этого назначается специальное значение ошибки, имеющее числовое значение 0
  • Сортировка происходит в цифровом порядке (например, порядок определения), а не в алфавитном порядке строки эквиваленты
  • задание работает либо с помощью строки значение или номер индекса
  • следующим образом: ENUM('0','1','2') следует избегать, так как '0' будет иметь целочисленное значение 1
7

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.

+0

PostgreSQL поддерживает ENUM с версии 8.3 (см. Мой ответ). – bortzmeyer 2008-12-09 13:29:49

+0

Спасибо, отредактировал мой ответ, чтобы это отразить. – mat 2008-12-09 14:42:17

2

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

Есть функции, которые work specifically on enums.

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

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

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

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

4

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

Смежные вопросы