Навигация типов данных MySQL: наборы и перечисления

Навигация типов данных 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 и как их эффективно использовать.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE