Spec-Zone.ru › MySQL 9.2

13.3.6 Тип ENUM

Объект ENUM — это строковый объект со значением, выбранным из списка разрешённых значений, перечисленных явно в спецификации столбца во время создания таблицы.

См. Раздел 13.3.1, «Синтаксис типа данных STRING» для синтаксиса типа ENUM и ограничений по длине.

Тип ENUM имеет следующие преимущества:

  • Компактное хранение данных в ситуациях, когда столбец имеет ограниченный набор возможных значений. Строки, указанные в качестве входных значений, автоматически кодируются как числа. См. Раздел 13.7, «Требования к хранению типов данных» для требований к хранению типа ENUM.

  • Читабельные запросы и вывод. Числа преобразуются обратно в соответствующие строки в результатах запросов.

и следующие потенциальные проблемы, которые следует учитывать:

  • Если вы используете значения перечисления, похожие на числа, легко перепутать буквальные значения с их внутренними индексными номерами, как описано в Ограничения перечисления.

  • Использование столбцов ENUM в предложениях ORDER BY требует особой осторожности, как описано в Сортировка перечисления.

  • Создание и использование столбцов ENUM

  • Значения индекса для литералов перечисления

  • Обработка литералов перечисления

  • Пустые или NULL значения перечисления

  • Сортировка перечисления

  • Ограничения перечисления

Создание и использование столбцов 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' в столбце VARCHAR.

Значения индексов для литералов перечисления

Каждое значение перечисления имеет индекс:

  • Элементам, указанным в спецификации столбца, назначаются индексные номера, начиная с 1.

  • Значение индекса пустого значения ошибки равно 0. Это означает, что вы можете использовать следующее предложение SELECT, чтобы найти строки, в которые были назначены недопустимые значения ENUM:

    mysql> SELECT * FROM tbl_name WHERE enum_col=0;
    
  • Индекс значения NULL равен NULL.

  • Термин «индекс» здесь относится к позиции в списке значений перечисления. Он не имеет никакого отношения к индексам таблицы.

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

Значение Индекс
NULL NULL
'' 0
'Mercury' 1
'Venus' 2
'Earth' 3

Столбец типа ENUM может иметь не более 65 535 различных элементов.

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

mysql> SELECT enum_col+0 FROM tbl_name;

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

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

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

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

Если вы сохраняете число в столбце типа 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 возвращаются как строки. Для получения информации об использовании метаданных набора результатов для их различения от других строк см. .

Пустые или NULL значения перечисления

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

  • Если вы вставляете недопустимое значение в столбец типа ENUM (то есть строку, отсутствующую в списке разрешённых значений), вместо неё вставляется пустая строка в качестве специального значения ошибки. Эту строку можно отличить от «обычной» пустой строки по тому, что эта строка имеет числовое значение 0. См. Значения индекса для литералов перечисления для получения подробной информации о числовых индексах для значений перечисления.

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

  • Если столбец типа ENUM объявлен как разрешающий NULL, значение NULL является допустимым значением для столбца, и значение по умолчанию равно NULL. Если столбец типа ENUM объявлен как NOT NULL, его значением по умолчанию является первый элемент из списка разрешённых значений.

Сортировка перечисления

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

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

  • Укажите список ENUM в алфавитном порядке.

  • Убедитесь, что столбец сортируется лексически, а не по индексным номерам, закодировав ORDER BY CAST(col AS CHAR) или ORDER BY CONCAT(col).

END_OF_DOCUMENT_MARKER

Ограничения перечислений

Значение перечисления не может быть выражением, даже тем, что вычисляется в строковое значение.

Например, это 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. Если вы используете число в качестве значения перечисления, всегда заключайте его в кавычки. Если кавычки опущены, число рассматривается как индекс. См. Обработка литералов перечисления, чтобы увидеть, как даже процитированное число может быть ошибочно использовано как числовой индекс.

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

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/enum.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API