Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL में ENUM (गणना) डेटा प्रकार:शीर्ष 12 तथ्य और उपयोगी टिप्स

MySQL ENUM डेटा एक स्ट्रिंग डेटा प्रकार है जिसका मान अनुमत मानों की सूची से चुना गया है। तालिका निर्माण के दौरान आपने ये अनुमत मान सेट किए हैं जैसा कि नीचे दिखाया गया है:

CREATE TABLE Product
(
    id int NOT NULL PRIMARY KEY,
    productName varchar(30) NOT NULL,
    color enum('blue','red','yellow','black','white') NOT NULL DEFAULT 'blue'
);

आसान है, है ना?

शुरुआत के लिए, डेटा सत्यापन किसी अन्य तालिका और एक विदेशी कुंजी के बिना तत्काल है। सख्त सर्वर मोड के तहत, इसका मतलब है कि आप गलत प्रविष्टि के लिए बाध्य नहीं कर सकते। यह बहुत अच्छा है!

या है?

दुनिया में किसी भी अन्य चीज़ की तरह, यह हमेशा के लिए खुशी की बात नहीं है।

MySQL ENUM के बारे में निम्नलिखित 12 प्रमुख तथ्यों को पढ़ने के बाद, आप तय कर सकते हैं कि यह MySQL में आपके अगले डेटाबेस या टेबल के लिए अच्छा है या नहीं।

इस लेख के लिए, MySQL संस्करण 8.0.23 है, और स्टोरेज इंजन InnoDB है।

1. MySQL ENUM एक कुंजी/स्ट्रिंग मान जोड़ी प्रकार है

MySQL ENUM एक कुंजी/मान युग्म है। मान तार हैं, और कुंजियाँ अनुक्रमणिका संख्याएँ हैं।

लेकिन सूचकांक कहाँ है?

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

लेकिन ये इंडेक्स कैसे गिने जाते हैं?

2. MySQL ENUM इंडेक्स 1 से शुरू होता है लेकिन NULL या ज़ीरो हो सकता है

मैं एक उदाहरण से शुरुआत करता हूँ।

CREATE TABLE people
(
  id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  lastname varchar(30) NOT NULL,
  firstname varchar(30) NOT NULL,
  middlename varchar(30) NOT NULL,
  gender enum('Male','Female') NOT NULL DEFAULT 'Female',
  country enum('United States', 'Canada', 'Brazil', 
               'United Kingdom','Poland','Ukraine', 'Lithuania',  
               'Japan','Philippines','Thailand', 'Australia','New Zealand')  
              DEFAULT 'United States',
  modifieddate datetime NOT NULL DEFAULT NOW() 
);

यहां 2 MySQL ENUM मान हैं: लिंग और देश . मुझे लिंग . से शुरू करने दें स्तंभ जिसमें 2 मान हैं:पुरुष और महिला . पुरुष . के लिए अनुक्रमणिका 1 है, और महिला 2 है। इसका मतलब है कि प्रमुख इंडेक्स 1 से शुरू होते हैं।

इस सरल उदाहरण से, आप देश . के लिए अनुक्रमणिका की पहचान कर सकते हैं कॉलम। इसमें 12 मान हैं। यह 1 के सूचकांक के साथ संयुक्त राज्य अमेरिका से शुरू होता है और 12 के सूचकांक के साथ न्यूजीलैंड के साथ समाप्त होता है।

नोट :यह अनुक्रमणिका उन तालिका अनुक्रमणिकाओं को संदर्भित नहीं करती है जिनका उपयोग हम तेज़ खोजों के लिए करते हैं।

इन नंबरों के अलावा 1 से 65,535 तक, ENUM कॉलम NULL या शून्य भी हो सकते हैं। हमारे उदाहरण में, देश कॉलम NULL स्वीकार करता है। इसलिए, इंडेक्स 1 से 12 के अलावा, NULL एक और संभावित इंडेक्स है जिसका NULL मान है।

आपके पास 0 इंडेक्स भी हो सकता है। यह निम्न स्थितियों में होता है:

  • आपके MySQL के लिए सर्वर मोड सख्त नहीं है।
  • आप एक ऐसा मान डालते हैं जो अनुमत मानों की सूची में नहीं है।
  • फिर, इंसर्ट सफल होगा, लेकिन मान शून्य के सूचकांक के साथ एक खाली स्ट्रिंग है।

त्रुटियों से बचने के लिए, हमेशा सख्त सर्वर मोड का उपयोग करें।

3. MySQL ENUM कॉलम में संभावित मानों को सीमित करता है

सख्त मोड के तहत, देश पहले हमारे उदाहरण में कॉलम केवल 12 संभावित मान स्वीकार करेगा। इसलिए, यदि आप ऐसा करने का प्रयास करते हैं, तो "कॉलम 'देश' के लिए डेटा काट दिया जाएगा" त्रुटि फेंक दी जाएगी:

INSERT INTO people (lastname, firstname, middlename, gender, country)
  VALUES ('Choi', 'Seungcheol', '','Male','South Korea');

नीचे त्रुटि संदेश हुआ क्योंकि दक्षिण कोरिया प्रगणित सूची में नहीं है।

त्रुटि संदेश MySQL वर्कबेंच जैसा ही है।

अगर यहां इस्तेमाल किया गया MySQL सर्वर केस-संवेदी है, तो इसे भी स्वीकार नहीं किया जाएगा:

INSERT INTO people (lastname, firstname, middlename, gender, country)
  VALUES ('Hemsworth', 'Chris', '', 'MALE', 'united states');

क्यों? हमने लिंग को पुरुष . के रूप में परिभाषित किया है , नहीं MALE . और देश है संयुक्त राज्य , नहीं संयुक्त राज्य।

अंत में, MySQL ENUM डेटा प्रकार में गणना किए गए मान विदेशी कुंजी बाधाओं की तरह कार्य करते हैं लेकिन बिना किसी अन्य तालिका के।

इसके अलावा, MySQL ENUM डेटा प्रदान करने का एक और लाभ है।

4. JOIN के उपयोग के बिना अनुकूल आउटपुट

जॉइन की कोई आवश्यकता नहीं है, लेकिन आउटपुट अनुकूल है। आइए इसे समझाने के लिए MySQL उदाहरण में नीचे दिए गए ENUM को लें:

SELECT * FROM people 
WHERE country = 4;

यह क्वेरी यूनाइटेड किंगडम से लोगों को पुनः प्राप्त करेगी। डिफ़ॉल्ट रूप से, आप उन स्ट्रिंग्स को देखते हैं जिन्हें आपने ENUM कॉलम में परिभाषित किया था। लेकिन आंतरिक रूप से, क्रमांकित अनुक्रमित संग्रहीत किए जाते हैं। ये रहा परिणाम:

नोट :आपके द्वारा देखा जाने वाला डेटा . का उपयोग करके उत्पन्न किया गया था MySQL के डेटा जनरेटिंग टूल के लिए dbForge Studio. मैंने टूल का उपयोग करके 50,000 नाम जेनरेट किए हैं।

इस बीच, एक अलग टेबल और जॉइन का उपयोग करते समय समान आउटपुट प्राप्त किया जा सकता है।

SELECT
 p.id
,p.lastname
,p.firstname
,p.middlename
,CASE WHEN p.gender = 'M' THEN 'Male' ELSE 'Female' END AS gender
,c.countryname AS country
,p.modifieddate
FROM people_no_enums p
LEFT JOIN country c ON p.country = c.id
WHERE p.country = 4;

तो, क्या आपको पूरी तरह से जॉइन से बचने के लिए MySQL ENUM का उपयोग करना चाहिए? निश्चित रूप से नहीं! यह एक छोटी लेकिन निश्चित सूची के लिए अच्छा है। अनिश्चित संख्या में पंक्तियों और अधिक विशेषताओं वाले अधिक डेटा के लिए एक तालिका की आवश्यकता होती है। और चित्र 2 की तरह एक मित्रवत आउटपुट बनाने के लिए, आपको एक JOIN की भी आवश्यकता होगी। एक अलग टेबल होना अधिक लचीला है और डेटा लाइव होने पर डेवलपर से कुछ भी नहीं चाहिए। Enumdatatype के साथ ऐसा नहीं है।

5. इंडेक्स या स्ट्रिंग मान के आधार पर MySQL एन्यूमरेशन को फ़िल्टर करें

बिंदु # 4 में, आपने ENUM कॉलम के साथ फ़िल्टर करने के लिए WHERE क्लॉज के साथ एक उदाहरण देखा। इसने देश को निर्दिष्ट करने के लिए सूचकांक का उपयोग किया। तो, यह भी काम करेगा:

SELECT * from people
WHERE country IN (1,3,5)
AND gender = 1;

आप नीचे दिए गए जैसे स्ट्रिंग मान का भी उपयोग कर सकते हैं:

SELECT * FROM people 
WHERE country='Philippines'
AND gender = 'Female';

6. अनुक्रमणिका द्वारा क्रमित किया जाता है

छँटाई करना थोड़ा मुश्किल हो सकता है। ENUM मान उनकी अनुक्रमणिका संख्याओं के अनुसार संग्रहीत किए जाते हैं, मान के अनुसार नहीं। नीचे दिए गए कोड और चित्र 3 में दिए गए आउटपुट को देखें।

SELECT DISTINCT 
 country AS CountryName
,country + 0 AS CountryId
FROM people
ORDER BY country;

यदि आप चाहते हैं कि छँटाई मूल्य पर आधारित हो, तो कॉलम को नीचे दिए गए CHAR की तरह CHAR में डालें।

SELECT DISTINCT 
 country AS CountryName
,country + 0 AS CountryId
FROM people
ORDER BY CAST(country AS char);

इसके बारे में क्या?

SELECT DISTINCT 
 country AS CountryName
,country + 0 AS CountryId
FROM people
ORDER BY CountryName;

इसके लुक से, मूल्य का उपयोग छँटाई के लिए किया जाएगा। लेकिन मामला वह नहीं है। आउटपुट चित्र 3 जैसा ही होगा। CAST के साथ ORDER BY मान के आधार पर छाँटने का सबसे अच्छा तरीका है।

7. MySQL ENUM संग्रहण केवल 2 बाइट तक है

आधिकारिक दस्तावेज़ीकरण के अनुसार, MySQL ENUM डिफ़ॉल्ट संग्रहण में अनुक्रमणिका शामिल है। परिणामी तालिका मूल्यों को संग्रहीत करने की तुलना में अधिक कॉम्पैक्ट है। 1 से 255 संभावित मानों के साथ गणना के लिए एक (1) बाइट। 256 से 65,535 संभावित मानों के लिए दो (2) बाइट्स।

लेकिन एक रहस्य है जो मैं आपको बताना चाहता हूं।

बेशक, जब भंडारण का संबंध है, तो मूल्य सूचकांक से अधिक पर कब्जा कर लेंगे। चूंकि उचित तालिका डिज़ाइन एक छोटे भंडारण पदचिह्न उत्पन्न करता है, आइए एक अलग देश तालिका के साथ एक और तालिका बनाएं।

CREATE TABLE country
(
   id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
   countryname varchar(30) NOT NULL,
   modifieddate datetime DEFAULT NOW()
);

CREATE TABLE people_no_enums
(
  id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  lastname varchar(30) NOT NULL,
  firstname varchar(30) NOT NULL,
  middlename varchar(30) NOT NULL,
  gender char(1) not NULL,
  country tinyint DEFAULT 1,
  modifieddate datetime NOT NULL DEFAULT NOW() 
);

अब, वही डेटा डालें।

INSERT INTO country (id, countryname, modifieddate)
  VALUES (1, 'United States', NOW()), (2, 'Canada', NOW()), (3, 'Brazil', NOW()), 
         (4, 'United Kingdom', NOW()), (5, 'Poland', NOW()), (6, 'Ukraine', NOW()), 
         (7, 'Lithuania', NOW()), (8, 'Japan', NOW()), (9, 'Philippines', NOW()), 
         (10, 'Thailand', NOW()), (11, 'Australia', NOW()), 
         (12, 'New Zealand', NOW());

INSERT INTO people_no_enums
SELECT
 p.id
,p.lastname
,p.firstname
,p.middlename
,CASE WHEN p.gender = 1 THEN 'M' ELSE 'F' END AS gender
,c.id
,p.modifieddate
FROM people p
LEFT JOIN country c ON p.country = c.countryname;

ऐसा करने के लिए, हम INFORMATION_SCHEMA.TABLES तालिका का उपयोग करते हैं। नीचे दिया गया कोड देखें:

SELECT
table_name,
ROUND(((data_length + index_length)), 2) AS "Size in Bytes"
FROM information_schema.TABLES
WHERE table_schema = "testenumsdb"
AND TABLE_NAME LIKE 'people%'
ORDER BY (data_length + index_length) DESC;

किसी तालिका की तुलना में ENUM स्तंभों के बिना एक सामान्यीकृत तालिका को बाइट्स में समान आकार की आवश्यकता होती है। दोनों के पास समान नाम के 50,000 रिकॉर्ड हैं जो InnoDB स्टोरेज इंजन का उपयोग करते हैं। लेकिन निश्चित रूप से, नया देश टेबल भी जगह घेर लेगा। आपको ENUM का उपयोग करने के अन्य लाभों और नुकसानों को तौलना होगा।

8. MySQL ENUM केवल स्ट्रिंग लिटरल्स के लिए है

MySQL ENUM केवल स्ट्रिंग अक्षर स्वीकार करता है। तो, नीचे दिया गया कोड काम नहीं करेगा:

CREATE TABLE Product
(
   id int NOT NULL PRIMARY KEY,
   productName varchar(30),
   color enum('red','orange',CONCAT('red','orange'))
);

Enumdatatype के अंदर CONCAT फ़ंक्शन अनुमति नहीं है साथ ही अन्य मान्य SQL अभिव्यक्तियाँ।

9. MySQL ENUM का पुन:उपयोग नहीं किया जा सकता

इस बिंदु से, आपको MySQL ENUM का स्याह पक्ष दिखाई देगा।

सबसे पहले, आप इसका पुन:उपयोग नहीं कर सकते। यदि आपको किसी अन्य तालिका में उनकी आवश्यकता है, तो आपको समान रंग, आकार और प्राथमिकता गणनाओं की नकल करनी होगी। नीचे दिए गए चित्र 6 में जैसा डिज़ाइन ENUM के साथ असंभव है।

उपरोक्त 2 तालिकाओं में ENUM का उपयोग करने के लिए, आपको 2 तालिकाओं पर प्राथमिकताओं की सूची की नकल करनी होगी।

10. अधिक मान जोड़ने के लिए तालिका को बदलने की आवश्यकता है

लिंग . में सूची पहले, हमने केवल 2 वस्तुओं का उपयोग करने की कोशिश की:पुरुष और महिला . क्या होगा अगर आपकी कंपनी LGBTQ को अपनाने का फैसला करती है? आपको एक वैकल्पिक तालिका चलाने और गणना के अंत में जोड़ने की आवश्यकता है लेस्बियन , समलैंगिक , उभयलिंगी , ट्रांसजेंडर , और क्वीर . यह रहा कोड:

ALTER TABLE people
   MODIFY COLUMN gender     
          enum('Male','Female','Lesbian','Gay','Bisexual','Transgender','Queer')     
          NOT NULL DEFAULT 'Male';

इसे मेरे लैपटॉप पर 50,000 रिकॉर्ड के साथ चलाने में केवल एक सेकंड से भी कम समय लगा। बड़ी और अधिक जटिल तालिकाओं में थोड़ा अधिक समय लगेगा। यदि लिंग सूची एक तालिका है, तो आपको केवल 5 नए मान डालने होंगे।

किसी मान का नाम बदलने के लिए भी ALTER TABLE की आवश्यकता होगी। एक अलग तालिका के लिए केवल एक आसान अद्यतन विवरण की आवश्यकता होती है।

11. आप संभावित मानों को आसानी से सूचीबद्ध नहीं कर सकते हैं

क्या आप किसी तालिका से ड्रॉपडाउन सूचियां या समूहीकृत रेडियो बटन पॉप्युलेट करते हैं? जब आपके पास कंट्री टेबल हो तो यह आसान होता है। एक चुनें आईडी करें , देश का नाम देश से , और आप ड्रॉपडाउन सूची को भरने के लिए तैयार हैं।

लेकिन आप इसे MySQL ENUM के साथ कैसे करेंगे?

सबसे पहले, INFORMATION_SCHEMA.COLUMNS तालिका से कॉलम की जानकारी इस तरह प्राप्त करें:

/* Get the possible values for country ENUM. */
SELECT  
 TABLE_NAME
,COLUMN_NAME
,COLUMN_TYPE
FROM information_schema.columns
WHERE TABLE_SCHEMA='testenumsdb'
  AND TABLE_NAME = 'people'
  AND COLUMN_NAME = 'country';

फिर, आपको उस स्ट्रिंग को पार्स करना होगा और ड्रॉपडाउन सूची को पॉप्युलेट करने से पहले उसे प्रारूपित करना होगा। काफी पुरातन, है ना?

लेकिन एक आखिरी बात है।

12. MySQL ENUM गैर-मानक है

ENUM ANSI SQL मानक का एक MySQL एक्सटेंशन है। अन्य RDBMS उत्पाद इसका समर्थन नहीं करते हैं। इसलिए, अपनी परियोजनाओं को शुरू करने से पहले उपयुक्त MySQL ट्यूटोरियल देखें। उदाहरण के लिए, यदि आपको ENUM से भरे अपने MySQL डेटाबेस को SQL सर्वर पर पोर्ट करने की आवश्यकता है, तो आपको एक वैकल्पिक हल करने की आवश्यकता है। आप SQL सर्वर में लक्ष्य तालिका को कैसे डिज़ाइन करते हैं, इसके आधार पर समाधान अलग-अलग होंगे।

नीचे की रेखा

आपको MySQL ENUM का उपयोग करने के पेशेवरों और विपक्षों को तौलना चाहिए। उचित सामान्यीकरण के साथ एक अलग तालिका लागू करना अनिश्चित भविष्य में सबसे अधिक लचीला है।

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में SUBSTR () फ़ंक्शन कैसे काम करता है

  2. MySQL डेटाबेस से कैसे कनेक्ट करें

  3. mysql लेनदेन - किसी भी अपवाद पर वापस रोल करें

  4. एक MySQL फ़ील्ड में अग्रणी और पिछली सफेद जगह को कैसे हटाएं?

  5. PHP - IN क्लॉज सरणी के साथ PDO का उपयोग करना