Перелік MySQL проти набору


88

Для типів даних MySQL "перелічення" та "встановити", які відмінності та переваги та недоліки використання одного проти іншого?

Приклад типу даних:

  • enum ('A', 'B', 'C')
  • встановити ('A', 'B', 'C')

Єдина різниця, про яку мені відомо, полягає в тому, що ENUM дозволяє вибрати лише одне значення порівняно з SET, щоб вибрати кілька значень.


5
Немає adv / disadv. Вам слід вибрати один із них залежно від ваших вимог.
ravnur

1
Два типи не пов’язані між собою. Ви можете також запитати, що краще - int або text?
Чеська

Відповіді:


66

Як зазначено в документації MySQL :

Визначення стовпця ENUM або SET дійсно діє як обмеження для значень, введених у стовпець. Помилка виникає для значень, які не відповідають цим умовам:

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

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


22
ПРИМІТКА! Значення (a, b, c, d)не буде відхилено. Просто dбуде відхилено, що призведе до значення (a, b, c).
Itay Grudev,

3
Це може бути офіційною документацією, але це все ще дуже заплутаний спосіб їх опису. На основі інших відповідей різниця стає зрозумілою. SET - це масив ENUM, де кожне значення складається з 0 або більше значень стилю перерахування.
Джонатан,

9
Це невдала відповідь. Попрошено чітке пояснення відмінностей та недоліків / переваг; офіційна документація, копією якої є лише відповідь, не робить цього.
Смуф

(a, b, c, d) буде відхилено, якщо ввімкнено строгий режим
Чінмай

2
Це не відповідь.
Аміт Шах

197

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


5
Чисто і легко зрозуміти!
Абу

Це правильна різниця, яка чітко описана. Дякую @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 насправді можна зберігати лише один раз кожного разу. І ви виявите, що результати останніх 2-х рядків будуть порожніми.


9

Насправді це досить просто:

Коли ви визначаєте ENUM ('Так', 'Ні', 'Можливо'), ви повинні ВСТАВИТИ лише одне з цих значень (або номер позиційного індексу)

Коли ви визначаєте SET ('R', 'W', 'X'), тоді ви можете ВСТАВИТИ порожній рядок або одне або кілька з цих значень. Якщо ви вставляєте щось, що не входить у наперед заданий набір, замість нього вставляється порожній рядок. Зверніть увагу, що перед вставкою всі повторювані значення відкидаються, тому вставляється лише один екземпляр кожного дозволеного значення.

Сподіваюся, це прояснить.

Зверніть увагу, що відповідь Winbobob є неправильною і містить недоліки прикладів, оскільки при вставці декількох значень значення повинні бути рядками, розділеними комами. Усі його вставки фактично вставляють лише одне значення (а два останні не входять у визначений набір)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.