2012-03-15 8 views
5

मैं एक MySQL स्तंभ निर्दिष्ट किया है के रूप में:एक TINYINT (1) कॉलम से बूलियन की बजाय एक int मान कैसे प्राप्त करें?

`type` TINYINT(1) NOT NULL DEFAULT '0' 

स्तंभ के इरादे 127 से अधिक नहीं के रूप में वहाँ एक बहुत कुछ वस्तु की तुलना में अधिक होने की उम्मीद नहीं कर रहे हैं एक पूर्णांक मान संग्रहीत है "प्रकार के।"

मैंने अपनी पंक्तियों में से एक के लिए मैदान में '2' संग्रहीत किया है।

SqlYog, एक सरल SELECT type FROM table उचित परिणाम पैदावार का उपयोग करना, 2.

हालांकि, कनेक्टर/नेट का उपयोग कर 6.1.2 (वैसे यह पुराने हो चुके एक सा, क्योंकि वर्तमान संस्करण 6.5.4 है), निम्न होता है:

var Temp = Reader["type"].GetType(); // equals "Boolean" 

स्तंभ इस प्रकार का आमतौर पर बूलियन मान के लिए इस्तेमाल किया है, लेकिन इस मामले में मैं पूर्णांक मान प्राप्त करना चाहते हैं।

int i = Reader.GetInt32("type"); // equals 1 (should be 2) 

एक TINYINT (1) एक .NET अनुप्रयोग में उपयोग करते हुए स्तंभ कनेक्टर/नेट से पूर्णांक मान प्राप्त करने के लिए उचित तरीका क्या है: निम्नलिखित अपेक्षित परिणाम उपज के लिए विफल रहता है?

यह MySQL संस्करण का उपयोग कर रहा है 5.5.16

+0

आप सही कर रहे हैं; 'टिन्यिनट' आमतौर पर बूलियन के लिए प्रयोग किया जाता है। मैं केवल एक नियमित 'INTEGER' प्रकार फ़ील्ड का उपयोग करने का सुझाव दूंगा, भंडारण स्थान * वह * महंगा नहीं हो सकता है। ;) –

+0

क्या आपने टेबल से 'प्रकार का चयन करें (टाइप के रूप में हस्ताक्षर किए) टाइप किया है? –

+1

संग्रहण कोई समस्या नहीं है; लेकिन मेरी चिंता गति/प्रदर्शन के लिए अधिक थी। यदि मुझे पता है कि कोई विशेष मान सीमा से अधिक नहीं होगा, तो मैं उचित रूप से कॉलम को आकार देने का प्रयास करता हूं। (यही कारण है कि मेरे सभी int कॉलम 'बिगिनट' नहीं हैं। :)) शायद मुझे सिर्फ 'स्मालिन' का उपयोग करना चाहिए और इसे एक दिन कॉल करना चाहिए, लेकिन मैं इस मामले पर और अधिक तकनीकी पृष्ठभूमि ढूंढना चाहता था। – JYelton

उत्तर

3

कनेक्टर के भ्रम के लिए जवाब MySQL docs; Numeric Types से हिस्सा हो सकता है:

MySQL 5.0.3, के रूप में एक BIT डेटा प्रकार बिट-फ़ील्ड मानों के भंडारण के लिए उपलब्ध है। (5.0.3 से पहले, MySQL BITTINYINT(1) के रूप में व्याख्या करता है।) ...

या (और भी अधिक संभावित) Numeric Type Overview से इस हिस्से:

BOOL, BOOLEAN

इन प्रकार के TINYINT(1) के लिए समानार्थक शब्द हैं। शून्य का मान झूठा माना जाता है। अशून्य मान सच माना जाता है ...

+0

मुझे लगता है कि यह इस सवाल का "क्यों" जवाब देता है। यह बताता है कि कनेक्टर के परिणाम स्क्लोगोग से अलग क्यों हैं। यह मुझे कामकाज के रूप में TINYINT (2) (या अधिक 'प्रदर्शन चौड़ाई') का उपयोग करने के लिए भी बहुत कुछ बताता है। – JYelton

3

एक समाधान मैंने पाया है बस UNSIGNED करने के लिए स्तंभ प्रकार बदलने के लिए:

`type` tinyint(1) unsigned NOT NULL DEFAULT '0' 

यह निम्न प्रभाव पड़ता है:

var Temp = Reader["type"].GetType(); // equals "Byte" 

जो .GetInt32() को कॉल करने पर उचित परिणाम (2) पुनर्प्राप्त करता है।

हालांकि अगर किसी कारण से आप -127 से 127 तक मूल्यों को स्टोर करना चाहते हैं (इसे एक हस्ताक्षरित TINYINT के रूप में उपयोग करना) यह समाधान काम नहीं करता है।


एक अन्य समाधान TINYINT (2) करने के लिए स्तंभ प्रकार बदलने के लिए है:

`type` tinyint(2) NOT NULL DEFAULT '0' 

यह देता है:

var Temp = Reader["type"].GetType(); // equals "SByte" 

भी उचित परिणाम उपज (2)।

हालांकि यह TINYINT (यानी TINYINT(#)) के बाद संख्या के उद्देश्य पर प्रश्न लाता है। क्या यह "optionally specifying the display width" के लिए नहीं है? शायद कोई इस बिंदु पर अधिक प्रकाश डाल सकता है।

4

रखो कि tinyint संख्या के रूप में उपयोग करने के लिए अपने कनेक्शन स्ट्रिंग में

TreatTinyAsBoolean = false

+0

इसका आधिकारिक दस्तावेज http://dev.mysql.com/doc/refman/5.5/en/connector-net-connection-options.html पर पाया जा सकता है टिप के लिए धन्यवाद। – JYelton

संबंधित मुद्दे