MySQL enum बनाम सेट


88

MySQL डेटा प्रकार "एनम" और "सेट" के लिए, एक बनाम दूसरे का उपयोग करने के अंतर और फायदे और नुकसान क्या हैं?

उदाहरण डेटा प्रकार:

  • एनम ('ए', 'बी', 'सी')
  • सेट ('ए', 'बी', 'सी')

एकमात्र अंतर जो मुझे पता है, वह यह है कि ENUM केवल एक मान का चयन करने की अनुमति देता है बनाम सेट एकाधिक मानों को चयनित करने की अनुमति देता है।


5
कोई adv / disadv नहीं। आपको अपनी आवश्यकताओं के आधार पर उनमें से एक का चयन करना चाहिए।
रावणुर

1
दो प्रकार असंबंधित हैं। आप यह भी पूछ सकते हैं कि कौन सा बेहतर है - इंट या टेक्स्ट?
बोहेमियन

जवाबों:


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)
इते ग्रामदेव

3
यह आधिकारिक दस्तावेज हो सकता है, लेकिन यह अभी भी उन्हें वर्णन करने का एक बहुत ही भ्रमित करने वाला तरीका है। अन्य उत्तरों के आधार पर अंतर स्पष्ट हो जाता है। SET ENUM का एक सरणी है, जहां प्रत्येक मान में 0 या अधिक enum शैली मान शामिल हैं।
जोनाथन

9
यह एक अच्छा जवाब नहीं है। मतभेदों और डिस / फायदों की स्पष्ट व्याख्या के लिए कहा गया था; आधिकारिक दस्तावेज, जिनमें से यह उत्तर एक मात्र प्रति है, ऐसा करने में विफल रहता है।
स्मूफ़

(क, ख, ग, घ) को खारिज कर दिया जाएगा यदि सख्त तरीका हो तो
चिन्मय

2
इसका जवाब नहीं है।
अमित शाह

197

सादृश्य:
ENUM = रेडियो फ़ील्ड (केवल स्वीकृत मान वे सूचीबद्ध हैं, जो केवल एक को चुन सकते हैं)
SET = चेकबॉक्स फ़ील्ड (केवल स्वीकृत मान उन सूचीबद्ध हैं, जो कई का चयन कर सकते हैं)


5
स्वच्छ और समझने में आसान!
अबू शोएब

यह सही अंतर है जो स्पष्ट रूप से वर्णित है। धन्यवाद @ ब्रैड कैंट
रवि तेजा

44

Enum और Set पूरी तरह से आवश्यकताओं पर निर्भर करता है, जैसे कि यदि आपके पास रेडियो बटन की सूची है, जहां एक समय में केवल एक को चुना जा सकता है, Enum का उपयोग करें। और अगर आपके पास चेकबॉक्स की एक सूची है जहां एक बार में अधिक है तो एक आइटम चुना जा सकता है, सेट का उपयोग करें।


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 ('हां', 'नहीं', 'हो सकता है') को परिभाषित करते हैं , तो आपको इनमें से केवल एक मान (या उनकी स्थिति सूचकांक संख्या) को सम्मिलित करना होगा

जब आप एक सेट ('आर', 'डब्ल्यू', 'एक्स') को परिभाषित करते हैं तो आप एक खाली स्ट्रिंग को सम्मिलित कर सकते हैं , या इनमें से एक या अधिक मानों हैं। यदि आप कोई ऐसी चीज सम्मिलित करते हैं जो पूर्वनिर्धारित सेट में नहीं है, तो इसके बजाय एक खाली स्ट्रिंग डाली जाती है। ध्यान दें कि डालने से पहले सभी डुप्लिकेट मानों को छोड़ दिया जाता है, इसलिए प्रत्येक अनुमत मूल्य का केवल एक उदाहरण डाला जा रहा है।

आशा है कि यह इसे साफ करता है।

कृपया ध्यान दें कि Winbobob का उत्तर गलत है और इसमें त्रुटिपूर्ण उदाहरण हैं, जैसे कई मानों को सम्मिलित करते समय, मानों को स्ट्रिंग्स होना चाहिए, कॉमा के साथ अलग किया जाना चाहिए। उसके सभी आवेषण वास्तव में सिर्फ एक ही मूल्य सम्मिलित कर रहे हैं (और अंतिम दो परिभाषित सेट में नहीं हैं)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.