CONTENT MANAGEMENT SYSTEM
Blox Logo
Blox CMS — блочный метод сайтостроения
.
 
Blox Help

←→

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

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

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

Тип ENUM

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

.tdd

<?php
    $types[1] = "enum('красный', 'желтый', 'зеленый')";
?>
А затем выводится в шаблоне:

.tpl

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

Тип 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). Причем, сами списки можно редактировать прямо в окне редактирования.