Кроме основных типов, которые обсуждались в предыдущих разделах, MySQL также расширяет свои спецификации на два сложных типа: ENUM и SET. Несмотря на то, что технически это строковые типы, они попадают в другую категорию, т.к. их значения выбираются из предварительно заданных строк. Тип ENUM (перечисление) разрешает выбор только одного значения из набора допустимых значений, тип SET допускает выборку любого произвольного количества значений из допустимого набора значений.
Тип ENUM
Этот тип данных обычно используется для задания взаимоисключающих значений, в которых допускается выбор только одного значения из набора. Самым характерным примером таких данных могут служить данные о поле человека, который может быть только мужским или только женским. Рассмотрим следующий пример. 
Сложные типы
Нетрудно заметить, что поля, объявленные с типом ENUM, могут содержать только те значения, которые были перечислены во множестве разрешенных значений или значений NULL, любая попытка использовать другие значения будет приводить к вставке MySQL пустой строки. При несовпадении регистра добавляемого значения, регистр вставленного значения будет автоматически изменен на регистр значения, с которым данное поле было объявлено. И это хорошо видно в последнем примере.
Интересно заметить, несмотря на то, что члены ENUM могут объявляться только как строки, внутренне они могут сохраняться как числа и индексироваться, начиная с 1. Тип ENUM может содержать максимум 65536 элементов при одном, резервируемом для хранения ошибок, этот элемент имеет индекс 0 (пустая строка).
Так как доступ к значениям типа ENUM может осуществляться по строке или по индексу, следующие два примера являются абсолютно идентичными.
Сложные типы
 MySQL рассматривает в качестве допустимых только те значения, которые присутствуют в объявлении типа ENUM; любая попытка вставить значения, отличные от этих, закончится неудачей и отображением значения ошибки. Это значит, что появляется возможность легко обнаружить различные ошибочные записи при поиске строк, содержащих пустую строку или соответствующее ей числовое значение 0. Это можно увидеть, немного изменив предыдущий пример, переделав его для подсчета количества строк с ошибочными значениями. Следующие два примера являются идентичными. 
Сложные типы
Тип SET
Подобным, хотя и не полностью аналогичным, является тип SET, позволяющий производить выборку любого количества значений из предопределенного набора строковых значений. В отличие от полей, объявленных с использованием типа ENUM, поля объявленные с типом SET, могут содержать ноль, один или более одного элементов допустимых значений. Это делает тип SET хорошим вариантом для выборки со многими возможными вариантами. Рассмотрим следующий пример.
Сложные типы
Как и в случае с типом ENUM, любая попытка использовать значение, которое не входит в предопределенный набор, завершится добавлением пустой строки.
Сложные типы
Тип SET допускает задание не более 64 элементов. Значения хранятся как последовательность битов, а бит, соответствующий выбранному элементу, будет иметь значение 1. Это битовое представление является простым и эффективным способом создания наборов элементов, он также позволяет избегать повторений, т.к. повторение одного и того же элемента в одном значении типа SET невозможно. Рассмотрим следующий пример.
Сложные типы
Этот тип данных также позволяет определять записи, имеющие ошибочные данные, - все, что нужно для этого, это подсчитать количество строк, которые имеют пустые строки или двоичное значение 0. Это хорошо видно из следующих двух примеров, которые являются идентичными.
Сложные типы