Особенности применения типов ENUM и SET (MySQL)

Типы ENUM и SET — это особые строковые типы, значения которых выбираются из фиксированного списка значений. Главная разница между ними заключается в том, что значение типа ENUM должно содержать точно одно значение из указанного множества, а тип SET позволяет выбрать нескольких значений одновременно.

В окне редактирования эта разница проявится в том, что редактирование данного типа ENUM будет заключаться в выборе одного значения из выпадающего списка, а редактирование данного типа SET будет заключаться в том, чтобы поставить флажки на нужных пунктах списка.

Тип ENUM

Вообще-то у типа ENUM никаких особенностей нет. Данное этого типа объявляется в дескрипторе обычным образом, например так:

.tdd
$types[1] = "enum('красный', 'желтый', 'зеленый')";?>

А затем выводится в шаблоне:

.tpl
Вы выбрали <?=$dat[1]?> сигнал светофора.

Можно задать значение по умолчанию:

.tdd
$types[1] = "enum('красный', 'желтый', 'зеленый') NOT NULL default 'красный'";

Тип SET

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

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

.tdd
<?php
    $types[1] = "set('груша', 'апельсин', 'банан')";
?>
Тогда список можно выводить так:

.tpl
Фрукты, которые я люблю:
<ul>
<?php
    $items = explode(",", $dat[1]); // Превратить список в массив
    foreach ($items as $item)
        echo "<li>$item</li>";
?>
</ul>

Условная выборка по полю типа SET не удобна, так как в pick-запросах проверяется значение поля целиком. В нашем же случае в полях находятся не просто значения, а списки значений. Поэтому для выборки записей по ключевому полю типа SET, лучше воспользоваться поисковым запросом.


Примечания

  • Известный баг MySQL: строчная буква я в полях типа SET и ENUM отображается некорректно. Есть несколько способов решения этой проблемы:
    • Во-первых, вместо нее можно использовать прописную букву Я. Но тогда уж лучше вообще все слова писать в верхнем регистре.
    • Во-вторых, можно использовать в полях типа SET и ENUM только латинские буквы, а для отображения русского варианта держать массив соответствия. Минус этого варианта – в окне редактирования мы будем видеть латинские буквы.
    • И, наконец, третий вариант, который полностью решает эту проблему – применять тип данных select. Этот тип позволяет создавать многоуровневые списки с неограниченным числом вложенных списков (nested lists). Причем, сами списки можно редактировать прямо в окне редактирования.