Spec-Zone .ru
спецификации, руководства, описания, API

11.4.4. ENUM Ввести

ENUM строковый объект со значением, выбранным из списка разрешенных значений, которые перечисляются явно в спецификации столбца в табличное время создания. У этого есть эти преимущества:

и эти потенциал выходит, чтобы рассмотреть:

Создание и Используя ENUM Столбцы

Перечислимая величина должна быть заключенным в кавычки строковым литералом. Например, можно составить таблицу с ENUM столбец как это:

CREATE TABLE shirts (    name VARCHAR(40),    size ENUM('x-small', 'small', 'medium', 'large', 'x-large'));INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),  ('polo shirt','small');SELECT name, size FROM shirts WHERE size = 'medium';+---------+--------+| name    | size   |+---------+--------+| t-shirt | medium |+---------+--------+UPDATE shirts SET size = 'small' WHERE size = 'large';COMMIT;

Вставка 1 миллиона строк в эту таблицу со значением 'medium' потребовал бы 1 миллиона байтов хранения, в противоположность 6 миллионам байтов, если бы Вы сохранили фактическую строку 'medium' в a VARCHAR столбец.

Индексируйте Значения для Литералов Перечисления

У каждой перечислимой величины есть индексирование:

Например, столбец, определенный как ENUM('Mercury', 'Venus', 'Earth') может иметь любое из значений, показанных здесь. Индексирование каждого значения также показывают.

Значение Индексировать
NULL NULL
'' 0
'Mercury' 1
'Venus' 2
'Earth' 3

ENUM у столбца может быть максимум 65 535 отличных элементов. (Практический предел - меньше чем 3000.) У таблицы может быть не больше, чем 255 уникальных определений списка элемента среди ENUM и SET столбцы, которые рассматривают как группу. Для получения дополнительной информации по этим пределам см. Раздел D.10.5, "Пределы, Наложенные .frm Файловая структура".

Если Вы получаете ENUM значение в числовом контексте, значение столбца индексирует, возвращается. Например, можно получить числовые значения от ENUM столбец как это:

mysql> SELECT enum_col+0 FROM tbl_name;

Функции такой как SUM() или AVG() это ожидает числовой бросок параметра параметр числу в случае необходимости. Для ENUM значения, индекс используется в вычислении.

Обработка Литералов Перечисления

Конечные пробелы автоматически удаляются из ENUM элемент оценивает в табличном определении, когда таблица составляется.

Когда получено, значения, сохраненные в ENUM столбец выводится на экран, используя lettercase, который использовался в определении столбца. Отметьте это ENUM столбцы могут быть присвоены набор символов и сопоставление. Для двоичных или чувствительных к регистру сопоставлений lettercase принимается во внимание, присваивая значения столбцу.

Если Вы храните число в ENUM столбец, число обрабатывается как индексирование в возможные значения, и сохраненное значение является элементом перечисления с этим, индексируют. (Однако, это не работает с LOAD DATA, который обрабатывает весь ввод как строки.), Если числовое значение заключается в кавычки, оно все еще интерпретируется как индексирование, если нет никакой строки соответствия в списке перечислимых величин. По этим причинам не желательно определить ENUM столбец с перечислимыми величинами, которые похожи на числа, потому что это может легко стать запутывающим. Например, у следующего столбца есть элементы перечисления со строковыми значениями '0', '1', и '2', но числовой индексируют значения 1, 2, и 3:

numbers ENUM('0','1','2')

Если Вы храните 2, это интерпретируется как индексировать значение, и становится '1' (значение с индексирует 2). Если Вы храните '2', это соответствует перечислимую величину, таким образом, это сохранено как '2'. Если Вы храните '3', это не соответствует перечислимой величины, таким образом, это обрабатывается как индексирование и становится '2' (значение с индексирует 3).

mysql> INSERT INTO t (numbers)
        VALUES(2),('2'),('3');mysql> SELECT * FROM t;+---------+| numbers |+---------+| 1       || 2       || 2       |+---------+

Определить все возможные значения для ENUM столбец, использовать SHOW COLUMNS FROM tbl_name LIKE 'enum_col' и синтаксический анализ ENUM определение в Type столбец вывода.

В API C, ENUM значения возвращаются как строки. Для получения информации об использовании метаданных набора результатов, чтобы отличить их от других строк, см. Раздел 21.8.5, "Структуры данных API C".

Пустой или NULL Перечислимые величины

Перечислимая величина может также быть пустой строкой ('') или NULL при определенных обстоятельствах:

Сортировка

ENUM значения сортируются основанные на их индексах, которые зависят от порядка, в котором элементы перечисления были перечислены в спецификации столбца. Например, 'b' виды прежде 'a' для ENUM('b', 'a'). Пустые строковые виды перед непустыми строками, и NULL вид значений перед всеми другими перечислимыми величинами.

Предотвратить неожиданные результаты при использовании ORDER BY пункт на ENUM столбец, используйте один из этих методов:

Ограничения

Перечислимая величина не может быть выражением, даже та, которая оценивает к строковому значению.

Например, это CREATE TABLE оператор не работает потому что CONCAT функция не может использоваться, чтобы создать перечислимую величину:

CREATE TABLE sizes (    size ENUM('small', CONCAT('med','ium'), 'large'));

Также невозможно использовать пользовательскую переменную как перечислимую величину. Эта пара операторов не работает:

SET @mysize = 'medium';CREATE TABLE sizes (    size ENUM('small', @mysize, 'large'));

Мы строго рекомендуем, чтобы Вы не использовали числа в качестве перечислимых величин, потому что это не экономит на хранении по соответствующему TINYINT или SMALLINT введите, и легко перепутать строки и базовые значения числа (который не мог бы быть тем же самым), если Вы заключаете в кавычки ENUM значения неправильно. Если Вы действительно используете число в качестве перечислимой величины, всегда включайте это в кавычки. Если кавычки опускаются, число расценивается как индексирование. См. Раздел 11.4.4, "Обработка Литералов Перечисления", чтобы видеть, как даже заключенное в кавычки число могло по ошибке использоваться, поскольку числовое индексирует значение.

Двойные значения в определении вызывают предупреждение, или ошибку, если строгий режим SQL включается.