2008-12-03 14 views
10

इस प्रश्न के बाद: "Database enums - pros and cons", मैं जानना चाहता हूं कि कौन से डेटाबेस सिस्टम गणना डेटा प्रकारों का समर्थन करते हैं, और वे यह कैसे करते हैं इसके बारे में कुछ विस्तार (उदाहरण के लिए आंतरिक रूप से क्या संग्रहीत किया जाता है, सीमाएं क्या हैं, क्वेरी सिंटैक्स प्रभाव , सूचकांक प्रभाव, ...)।कौन सी डेटाबेस सिस्टम एक ईएनएन डेटा प्रकार का समर्थन करते हैं, जो नहीं?

अन्य मामलों में उपयोग के मामलों या पेशेवरों और विपक्षों की चर्चा होनी चाहिए।

उत्तर

4

ओरेकल ENUM का समर्थन नहीं करता है।

8

मुझे पता है कि MySQL समर्थन Enum करता है:

  • डेटा प्रकार संबद्ध तार के साथ पूर्णांक मान के रूप में लागू किया जाता है
  • आप 65.535 तत्वों की एक अधिकतम एक भी शुमार
  • प्रत्येक स्ट्रिंग है के लिए हो सकता है परिभाषा
  • के क्रम में 1 से गिनती संख्यात्मक गणना, क्षेत्र के सांख्यिक मूल्य "SELECT enum_col+0"
  • गैर-स्ट्र में ict SQL मोड, इन-इन-सूची मानों को असाइन करने के लिए आवश्यक रूप से त्रुटि नहीं होती है, बल्कि इसके बजाय एक विशेष त्रुटि मान असाइन किया गया है, संख्यात्मक मान 0
  • सॉर्टिंग संख्यात्मक क्रम में होती है (उदा। परिभाषा के आदेश), नहीं स्ट्रिंग की वर्णमाला के क्रम में समकक्ष
  • काम या तो मूल्य स्ट्रिंग या इंडेक्स नंबर
  • के माध्यम से काम करता है इस: ENUM('0','1','2'), बचा जाना चाहिए क्योंकि '0' पूर्णांक मान होता 1
7

PostgreSQL 8.3 से आगे ENUM का समर्थन करता है। पुराने संस्करणों के लिए, आप उपयोग कर सकते हैं:

आप कुछ इस तरह कर रही द्वारा एक Enum अनुकरण कर सकते हैं:

CREATE TABLE persons (
    person_id int not null primary key, 
    favourite_colour varchar(255) NOT NULL, 
    CHECK (favourite_colour IN ('red', 'blue', 'yellow', 'purple')) 
); 

तुम भी हो सकता है:

CREATE TABLE colours (
    colour_id int not null primary key, 
    colour varchar(255) not null 
) 
CREATE TABLE persons (
    person_id int not null primary key, 
    favourite_colour_id integer NOT NULL references colours(colour_id), 
); 

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

आप अपना खुद का प्रकार भी बना सकते हैं जो एक enum करता है, लेकिन मुझे नहीं लगता कि यह वर्चर और CHECK से कहीं अधिक तेज होगा।

+0

PostgreSQL संस्करण 8.3 के बाद से ENUM का समर्थन करता है (मेरा उत्तर देखें)। – bortzmeyer

+0

धन्यवाद, इसे प्रतिबिंबित करने के लिए मेरा उत्तर संपादित किया। – mat

2

क्या चटाई के विपरीत कहा, PostgreSQL does support ENUM (के बाद से संस्करण 8.3, पिछले एक):

essais=> CREATE TYPE rcount AS ENUM (
essais(> 'one', 
essais(> 'two', 
essais(> 'three' 
essais(>); 
CREATE TYPE 
essais=> 
essais=> CREATE TABLE dummy (id SERIAL, num rcount); 
NOTICE: CREATE TABLE will create implicit sequence "dummy_id_seq" for serial column "dummy.id" 
CREATE TABLE 
essais=> INSERT INTO dummy (num) VALUES ('one'); 
INSERT 0 1 
essais=> INSERT INTO dummy (num) VALUES ('three'); 
INSERT 0 1 
essais=> INSERT INTO dummy (num) VALUES ('four'); 
ERROR: invalid input value for enum rcount: "four" 
essais=> 
essais=> SELECT * FROM dummy WHERE num='three'; 
id | num 
----+------- 
    2 | three 
    4 | three 

वहाँ कार्य करता है जो work specifically on enums हैं।

इंडेक्सिंग enum प्रकारों पर ठीक काम करता है।

मैनुअल के अनुसार, कार्यान्वयन इस प्रकार है:

एक enum मूल्य डिस्क पर चार बाइट्स पर है। एनम वैल्यू के टेक्स्टुअल लेबल की लंबाई PostgreSQL में संकलित NAMEDATALEN सेटिंग द्वारा सीमित है; मानक बनाता है इसका मतलब है कि अधिकतम 63 बाइट्स पर इसका मतलब है।

एनम लेबल केस संवेदनशील हैं, इसलिए 'खुश' 'हैप्पी' जैसा नहीं है। लेबल में रिक्त स्थान भी महत्वपूर्ण हैं।

+0

क्या आप यह पता लगा सकते हैं कि ENUM का समर्थन करने वाला पहला संस्करण कौन सा संस्करण था और उस जानकारी को यहां पोस्ट किया गया था? धन्यवाद! (हो सकता है कि आप कुछ अतिरिक्त जानकारी भी संकलित कर सकें कि वे आंतरिक रूप से कैसे काम करते हैं।) – Tomalak

+0

हो गया। मैंने सभी अनुरोधित विवरण जोड़े। – bortzmeyer

4

AFAIK, न तो आईबीएम डीबी 2 और न ही आईबीएम इनफॉर्मिक्स गतिशील सर्वर समर्थन ENUM प्रकार।

1

MSSQL ENUM का समर्थन नहीं करता है।

जब आप एंटीटी फ्रेमवर्क 5 का उपयोग करते हैं, तो आप enums का उपयोग कर सकते हैं (देखें: Enumeration Support in Entity Framework और EF5 Enum Types Walkthrough), लेकिन फिर भी मान डेटाबेस में int के रूप में संग्रहीत किए जाते हैं।