ENUM (перечисление) - это столбец, который может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы.
Этим значением также может быть пустая строка ("") или NULL при определенных условиях:
Если делается всавка некорректного значения в столбец ENUM (т.е. вставка строки, не перечисленной в списке допустимых), то вставляется пустая строка, что является указанием на ошибочное значение. Эта строка отличается от "обычной" пустой строки по тому признаку, что она имеет цифровое значение, равное 0. Об этом чуть ниже.
Если ENUM определяется как NULL, то тогда NULL тоже является допустимым значением столбца и значение по умолчанию - NULL. Если ENUM определяется как NOT NULL, то значением по умолчанию является первый элемент из списка допустимых значений.
Каждая величина из допустимы имеет индекс:
Значение из списка допустимых величин, определенных при создании таблицы нумеруются, начиная с 1.
-
Индекс пустой ошибочной строки - 0. Это означает что вы можете использовать следующий SELECT для того, чтобы найти записи, в которые были вставлены некорректные значения ENUM:
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
Индекс значения NULL - NULL.
Например, столбец, определенный как ENUM("один", "два", "три") может иметь любую из перечисленных величин. Индекс каждой величины также известен:
Величина | Индекс |
NULL |
NULL
|
"" |
0 |
"один" |
1 |
"два" |
2 |
"три" |
3 |
Перечисление может иметь максимум 65535 элементов.
Начиная с 3.23.51, оконечные пробелы автоматически удаляются из величин этого столбца в момент создания таблицы.
Регистр не играет роли, когда вы делаете вставку в столбец ENUM. Однако регистр значений, получаемых из этого столбца, совпадает с регистром в написании соответствующего значения, заданного во время создания таблицы.
Если вы делаете выборку столбца ENUM в числовом контексте, возвращается индекс значения. Например, вы можете получить численное значение ENUM таким образом:
mysql> SELECT enum_col+0 FROM tbl_name;
Если вы вставляете число в столбец ENUM, это число воспринимается как индекс, и в таблицу записывается соответствующее этому индексу значение перечисления. (Однако, это не будет работать с LOAD DATA, который воспринимает все входящие данные как строки.) Не рекомендуется сохранять числа в перечислении, т.к. это может привести к излишней путаннице.
Значения перечисления сортируются в соответствии с порядком, в котором
допустимые значения были заданы при создании таблицы. (Другими словами,
значения ENUM сортируются в соответствии с ихними индексами.) Например,
"a"
в отсортированном выводе будет присутствовать раньше чем "b"
для ENUM("a", "b")
, но "b"
появится раньше "a"
для
ENUM("b","a")
. Пустые строки возвращаются перед непустыми строками, и
NULL-значения будут выведены в самую первую очередь.
Для предотвращения неожиданностей, указывайте список ENUM
в алфавитном
порядке. Вы также можете использовать GROUP BY CONCAT(col)
чтобы
удостовериться, что столбец отсортирован в алфавитном порядке, а не по индексу.
Если вам нужно получить список возможных значения для столбца ENUM, вы должны вызвать
SHOW COLUMNS FROM имя_таблицы LIKE имя_столбца_enum
и проанализировать определение ENUM во втором столбце.