MySQL enum vs. set

89

Для типов данных MySQL «перечисление» и «набор», каковы различия, преимущества и недостатки использования одного по сравнению с другим?

Пример типа данных:

  • перечисление ('A', 'B', 'C')
  • set ('A', 'B', 'C')

Единственное различие, о котором я знаю, заключается в том, что ENUM позволяет выбирать только одно значение, а SET позволяет выбирать несколько значений.

tfont
источник
5
Нет нареканий / недостатков. Вы должны выбрать один из них в зависимости от ваших требований.
ravnur
1
Эти два типа не связаны. Вы также можете спросить, что лучше - int или text?
Bohemian

Ответы:

66

Как указано в документации MySQL :

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

Значение ENUM должно быть одним из перечисленных в определении столбца или его внутренним числовым эквивалентом. Значение не может быть значением ошибки (то есть 0 или пустой строкой). Для столбца, определенного как ENUM ('a', 'b', 'c'), такие значения, как '', 'd' или 'ax' являются недопустимыми и отклоняются.

Значение SET должно быть пустой строкой или значением, состоящим только из значений, перечисленных в определении столбца, разделенных запятыми. Для столбца, определенного как SET ('a', 'b', 'c'), значения, такие как 'd' или 'a, b, c, d', являются недопустимыми и отклоняются.

user2001117
источник
22
НОТА! Значение (a, b, c, d)не будет отклонено. Просто dбудет отклонено, что приведет к получению значения (a, b, c).
Итай Грудев
3
Это может быть официальная документация, но это все еще очень запутанный способ их описания. На основании других ответов разница становится очевидной. SET - это массив ENUM, где каждое значение состоит из 0 или более значений стиля перечисления.
Jonathon
9
Это плохой ответ. Было запрошено четкое объяснение различий и недостатков / преимуществ; официальная документация, для которой этот ответ является простой копией, этого не делает.
Smuuf
(a, b, c, d) будут отклонены, если
включен
2
Это не ответ.
Амит Шах
198

аналогия:
ENUM = радиополя (перечислены только допустимые значения, можно выбрать только одно)
SET = поля флажка (перечислены только допустимые значения, можно выбрать несколько)

Брэд Кент
источник
5
Чисто и понятно!
Abu Shoeb
Это правильное различие, которое четко описано. Спасибо @Brad Kent
Ravi Teja
44

Enum и Set полностью зависят от требований, например, если у вас есть список переключателей, в котором можно выбрать только один, используйте Enum. И если у вас есть список флажков, в котором одновременно можно выбрать более одного элемента, используйте set.

Абхишек Сингх
источник
22
CREATE TABLE setTest(
  attrib SET('bold','italic','underline')
);

INSERT INTO setTest (attrib) VALUES ('bold');
INSERT INTO setTest (attrib) VALUES ('bold,italic');
INSERT INTO setTest (attrib) VALUES ('bold,italic,underline');

Вы можете скопировать приведенный выше код и вставить его в mysql, и вы обнаружите, что SET на самом деле является коллекцией. Вы можете сохранить каждую комбинацию объявленных вами атрибутов.

CREATE TABLE enumTest(
 color ENUM('red','green','blue')
);

INSERT INTO enumTest (color) VALUES ('red');
INSERT INTO enumTest (color) VALUES ('gray');
INSERT INTO enumTest (color) VALUES ('red,green');

Вы также можете скопировать приведенный выше код. И вы обнаружите, что каждый ENUM на самом деле может быть сохранен только один раз каждый раз. И вы обнаружите, что результаты двух последних строк будут пустыми.

Winbobob
источник
9

На самом деле это довольно просто:

Когда вы определяете ENUM ('Да', 'Нет', 'Может быть'), вы должны ВСТАВИТЬ только одно из этих значений (или их порядковый номер)

Когда вы определяете SET ('R', 'W', 'X'), вы можете ВСТАВИТЬ пустую строку или одно или несколько из этих значений. Если вы вставляете что-то, чего нет в предопределенном наборе, вместо этого вставляется пустая строка. Обратите внимание, что перед вставкой все повторяющиеся значения отбрасываются, поэтому вставляется только один экземпляр каждого разрешенного значения.

Надеюсь, это проясняет ситуацию.

Обратите внимание, что ответ Winbobob неверен и содержит некорректные примеры, так как при вставке нескольких значений значения должны быть строками, разделенными запятыми. Все его вставки фактически вставляют только одно значение (а последние два не входят в определенный набор)

Харли Х.
источник