
Навигация типов данных MySQL: наборы и перечисления
16 июля 2025 г.Связанные статьи
- Дата, время и временная метка
- Целое число, плавание и кусоч
- Перечисление и наборы(Вот этот)
Введение
Эта статья продолжает мою серию о типах данных MySQL. Ранее я освещал числовые типы и типы даты/времени. Эта статья посвященаSET
иENUM
Типы, специализированные типы данных, которые можно использовать для ограниченных списков данных и делают схемы более понятными, но также могут вызвать проблемы, если не использовать тщательно. Сначала я посмотрю, что они есть, а затем приведу примеры общих ошибок и как их избежать.
Что их энум и типы наборов?
Перевозить
- Строковой объект, который может содержать одно значение, выбранное из предопределенного списка.
- Пример использования: статусы заказа (
'pending'
В'paid'
В'shipped'
В'cancelled'
) - Внутренне хранится как целочисленный индекс (1).
- Поддерживает до 65 535 элементов (например
SMALLINT
)
НАБОР
- Строковой объект, который может удерживать любую комбинацию значений из предопределенного списка.
- Пример использования: разрешения пользователя (
'read'
В'write'
В'delete'
) - Внутренне хранится как растровое изображение (каждый бит представляет, присутствует ли значение).
- Поддерживает до 64 элементов (например
BIT(64)
)
Синтаксис и примеры
Вот примеры таблицы для заказов с полем состояния, которое используетсяENUM
введите для указания доступных статусов заказа:
Создать заказы на таблицах ( ID int auto_increment Первичный ключ, Статус Enum («ожидающий», «оплачен», «отправлен», «отменен»), а не нулевой дефолт «В ожидании» );
Чтобы вставить два заказа в таблицу:
Вставить в orders () values (); Вставить в значения орденов (статус) ('оплаченный');
Выбор всех рядов с помощью дополнительного численного представления поля состояния:
Выберите идентификатор, статус, статус+0 из заказов; +----+---------+----------+ | id | Статус | Статус+0 | +----+---------+----------+ | 1 | В ожидании | 1 | | 2 | Оплаченный | 2 | +----+---------+----------+ 2 ряда в наборе (0,000 с)
Вот примеры таблицы сSET
поле:
Создать пользователей таблицы ( ID int auto_increment Первичный ключ, Разрешения SET («Читать», «написать», «удалить») не нулевой );
Вставка пользователя с несколькими разрешениями:
Вставить в значения пользователей (разрешения) («Читать, написать»);
Общие ловушки и как их избежать
Конечно, я могу начать с того, что если вы используете очень старые версии MySQL или настройки, которые не являются достаточно строгими, вы можете пропустить ошибки, связанные со значениями написания, которые не включены в определение поля. В этом случае в поле будет записано пустое значение. Но я надеюсь, что вы сможете использовать довольно недавние версии MySQL. Я также надеюсь, что вы поймете ограничение диапазона этих типов поля и не пытаетесь хранить более 64 значений в наборах.
Таким образом, наиболее распространенная проблема связана с изменениями в определениях поля. Представьте, что кто -то добавляет новую ценность в серединуENUM
Список вариантов:
Создать заказы на таблицах ( ID int auto_increment Первичный ключ, Статус Enum («В ожидании», «оплаченный», «отправлен»), а не нулевой дефолт «В ожидании» ); Вставить в значения орденов (статус) ('оплаченный'); Выберите идентификатор, статус, статус+0 из заказов; +----+---------+----------+ | id | Статус | Статус+0 | +----+---------+----------+ | 1 | Оплаченный | 2 | +----+---------+----------+ 1 строки в наборе (0,000 с) Заказы об изменении таблицы изменяют статус enum («ожидающий», «принятый», «оплаченный», «отправлен»), а не нулевой дефолт «ожидающий»;
Как магазины MySQLENUM
Поля как целые числа внутри, вот что у нас будет:
Выберите идентификатор, статус, статус+0 из заказов;
+----+----------+----------+ | id | Статус | Статус+0 | +----+----------+----------+ | 1 | принято | 2 | +----+----------+----------+ 1 строки в наборе (0,000 с)
Уоус! Вы должны помнить, что переупорядочение или вставка нового варианта в любом месте, но конец меняет отображение индекса, что приводит к несоответствию данных.
Второе, что я хочу упомянуть, это то, что в то время как магазины MySQL перечисляются и устанавливаются в качестве целых чисел, он сортирует и сравнивает их как собранные строки при выборе. Это может удивить разработчиков, ожидая числового порядка.
Заключение
ENUM
иSET
Может быть мощными инструментами для ограничения значений непосредственно в вашей схеме. Но с их удобством приходит предостережение вокруг упорядочения, дефолтов и молчаливого принуждения. Понимая их поведение и следуя лучшим практикам, вы можете избежать многих общих ловушек и сохранить свои данные в соответствии.
Следите за обновлениями, чтобы получить больше статей в этой серии, исследуя другие типы данных MySQL и как их эффективно использовать.
Оригинал