MySQL enum ve set karşılaştırması


92

MySQL Veri türü "enum" ve "set" için birini diğerine karşı kullanmanın farklılıkları, avantajları ve dezavantajları nelerdir?

Örnek veri türü:

  • enum ('A', 'B', 'C')
  • küme ('A', 'B', 'C')

Bildiğim tek fark, ENUM'un yalnızca bir değerin seçilmesine izin vermesidir, buna karşılık SET birden fazla değerin seçilmesine izin verir.


5
Adv / disadv yok. Gereksinimlerinize göre bunlardan birini seçmelisiniz.
ravnur

1
İki tür birbiriyle ilgisizdir. Hangisinin daha iyi olduğunu sorabilirsiniz - int mi yoksa metin mi?
Bohemian

Yanıtlar:


68

As MySQL dokümantasyon devletler:

Bir ENUM veya SET sütununun tanımı, sütuna girilen değerler üzerinde bir sınırlama görevi görür. Bu koşulları karşılamayan değerler için bir hata oluşur:

ENUM değeri, sütun tanımında listelenenlerden biri veya bunun dahili sayısal eşdeğeri olmalıdır. Değer, hata değeri (yani, 0 veya boş dize) olamaz. ENUM ('a', 'b', 'c') olarak tanımlanan bir sütun için, '', 'd' veya 'ax' gibi değerler yasa dışıdır ve reddedilir.

Bir SET değeri, boş dize veya virgülle ayrılmış sütun tanımında listelenen değerlerden oluşan bir değer olmalıdır. SET ('a', 'b', 'c') olarak tanımlanan bir sütun için, 'd' veya 'a, b, c, d' gibi değerler yasa dışıdır ve reddedilir.


22
NOT! Bir değeri (a, b, c, d)reddedilmeyecek. Sadece dreddedilecek ve böylece değerle sonuçlanacaktır (a, b, c).
Itay Grudev

3
Bu resmi belgeler olabilir, ancak yine de onları tanımlamanın çok kafa karıştırıcı bir yoludur. Diğer cevaplara göre fark netleşir. SET, her değerin 0 veya daha fazla enum stili değerinden oluştuğu bir ENUM dizisidir.
Jonathon

10
Bu iyi bir cevap değil. Farklılıkların ve eksikliklerin / avantajların net bir açıklaması istenmiştir; bu cevabın sadece bir kopyası olan resmi belgeler bunu yapamaz.
Smuuf

(a, b, c, d) Katı mod açıksa reddedilecektir
Chinmay

2
Cevap bu değil.
Amit Shah

204

benzetme:
ENUM = radyo alanları (yalnızca kabul edilen değerler listelenenlerdir, yalnızca birini seçebilir)
SET = onay kutusu alanları (yalnızca kabul edilen değerler listelenenlerdir, birden çok seçebilir)


5
Temiz ve anlaşılması kolay!
Abu Shoeb

Bu, açıkça anlatılan doğru farktır. Teşekkür ederim @Brad Kent
Ravi Teja

44

Enum ve Set tamamen gereksinimlere bağlıdır, örneğin bir seferde yalnızca birinin seçilebileceği bir radyo düğmesi listeniz varsa Enum'u kullanın. Ve bir seferde birden fazla öğenin seçilebileceği bir onay kutusu listeniz varsa, set'i kullanın.


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');

Yukarıdaki kodu kopyalayıp mysql'e yapıştırabilirsiniz ve SET'in aslında bir koleksiyon olduğunu göreceksiniz . Bildirdiğiniz her bir öznitelik kombinasyonunu saklayabilirsiniz.

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');

Yukarıdaki kodu da kopyalayabilirsiniz. Ve her ENUM'un aslında her seferinde yalnızca bir kez saklanabileceğini göreceksiniz . Ve son 2 satırın sonuçlarının boş olacağını göreceksiniz.


9

Aslında oldukça basit:

Bir tanımladığınızda enum ( 'Evet', 'Hayır', 'Belki') o zaman gerekir sadece bu değerlerden birini (veya pozisyonel dizin numarası) INSERT

Bir tanımlarken SET (R '', 'W, 'X') daha sonra olabilir , boş bir dize INSERT, ya da bir ya da daha fazla bu değerlerin. Önceden tanımlanmış kümede olmayan bir şey eklerseniz, bunun yerine boş bir dize eklenir. Tüm yinelenen değerlerin eklenmesinden önce atıldığını, bu nedenle izin verilen her değerin yalnızca bir örneğinin eklendiğini unutmayın.

Umarım bu sorunu çözer.

Lütfen Winbobob'un cevabının yanlış olduğunu ve hatalı örnekler içerdiğini unutmayın, çünkü birden çok değer eklerken, değerler virgülle ayrılmış dizeler olmalıdır. Tüm eklemeleri aslında yalnızca tek bir değer ekliyor (ve son ikisi tanımlanmış kümede değil)


0

ENUM -> eklemek için mevcut değerlerden yalnızca birini seçin.

(no_null, no_any_duplicate)


AYARLA -> bir küme gibi herhangi bir kombinasyonu veya tek bir değeri seçin ve bunları içine ekleyin.

(boş, tek_değerler, tümü_ kullanılabilir_değerler_birlikte)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.