2012-07-23 9 views
30

मेरी बनाने तालिका स्क्रिप्ट से, मैं थोड़ा के रूप में hasMultipleColors क्षेत्र परिभाषित किया है:MySQL हमेशा लौटने बीआईटी के रूप में रिक्त मानों

hasMultipleColors BIT NOT NULL, 

जब एक सम्मिलित चल रहा है, वहाँ कोई चेतावनी इस के लिए फेंक दिया या अन्य बीआईटी हैं खेतों, लेकिन पंक्तियों का चयन से पता चलता है कि सभी बीआईटी मूल्य खाली हैं।

मैन्युअल रूप से कमांड लाइन से इन रिकॉर्ड्स को अपडेट करने का प्रयास करने से अजीब प्रभाव मिलता है - यह दिखाता है कि रिकॉर्ड मिलान और बदल गया (यदि उपयुक्त हो), लेकिन फिर भी हमेशा खाली दिखाता है।

सर्वर संस्करण: 5.5.24-0ubuntu0.12.04.1 (उबंटू)

mysql> update pumps set hasMultipleColors = 1 where id = 1; 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 1 Changed: 0 Warnings: 0 

mysql> select hasMultipleColors from pumps where id = 1; 
+-------------------+ 
| hasMultipleColors | 
+-------------------+ 
|     | 
+-------------------+ 
1 row in set (0.00 sec) 

mysql> update pumps set hasMultipleColors = b'0' where id = 1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

mysql> select hasMultipleColors from pumps where id = 1; 
+-------------------+ 
| hasMultipleColors | 
+-------------------+ 
|     | 
+-------------------+ 
1 row in set (0.00 sec) 

किसी भी विचार?

+1

इसके लिए आप 'BIT' के बजाय' BOOL' का उपयोग क्यों नहीं कर रहे हैं? अपने क्षेत्र के नाम के अर्थशास्त्र से, यह अधिक समझ में आता है। – Romain

+2

क्या बूल बनाम बीआईटी बनाम टिन्यिनट डेटा-प्रकार के बारे में कुछ पढ़ा गया था, और मैंने जो ले लिया था, वह था कि MySQL बहुत खराब तरीके से बूल को संभालता है - अन्य आरडीबीएमएस समाधानों के लिए पोर्टेबल नहीं - इसलिए यह आमतौर पर टिन्यिनट के साथ जाने के लिए आदर्श है या बीआईटी (अधिक कुशल)। – CdrXndr

उत्तर

44

आप एक पूर्णांक के लिए बिट क्षेत्र कास्ट करने के लिए की जरूरत है।

mysql> select hasMultipleColors+0 from pumps where id = 1; 

यह एक बग के कारण है, देखें: http://bugs.mysql.com/bug.php?id=43670। स्थिति कहती है: ठीक नहीं होगा।

+1

समझ गया, धन्यवाद। इसलिए डेटा को ठीक तरह से कैप्चर और संग्रहीत करने के बजाए यह प्रदर्शन का एक मुद्दा है।चयन में * * का उपयोग करते समय स्वचालित रूप से थोड़ा डेटाटाइप डालने का कोई तरीका? – CdrXndr

+1

मेरे पास इसका एक बहुत अजीब संस्करण है, जहां पहले मामले में, बीआईटी फ़ील्ड में कोई समस्या नहीं है। लेकिन फिर एक अलग तालिका में, जहां बीआईटी फ़ील्ड को पहली तालिका में परिभाषित किया गया है, कुछ भी प्रिंट नहीं करता है जब तक कि मैं प्रत्येक बिट कॉलम में 0 जोड़ने जैसा कुछ नहीं करता। अगर यह एक बग है, तो यह सिर्फ पहले मामले में क्यों काम कर रहा है लेकिन दूसरा नहीं? टीएल: डॉरी विवरण देने के लिए डीआर। एक अन्य अजीबता: जबकि यह समस्या मेरे सर्वर पर mysql क्लाइंट में होती है, मेरे आईडीई (PHPStorm) में बनाए गए क्लाइंट में समस्या नहीं होती है, और बस बीआईटी फ़ील्ड के साथ काम करता है। –

+0

@ आरटीबी इस समस्या का एक आसान समाधान है और मैंने इसे जोड़ा। –

0

आपके द्वारा देखे जाने वाले प्रभाव का वास्तविक कारण यह है कि यह सही और अपेक्षित है।

bit क्षेत्र बिट्स है और इस प्रकार बिट्स लौटने के लिए, और उत्पादन के लिए एक चरित्र के रूप में एक बिट की कोशिश कर दिया बिट मूल्य के साथ चरित्र दिखा देंगे - इस मामले एक शून्य चौड़ाई नियंत्रण चरित्र में।

कुछ सॉफ़्टवेयर इस स्वचालित रूप से संभाल सकते हैं, लेकिन कमांड लाइन MySQL के लिए आपको इसे किसी तरह से int (जैसे शून्य जोड़कर) डालना होगा।

PHP जैसी भाषाओं में ord() फ़ंक्शन का उपयोग करके आपको सही मूल्य मिलेगा (हालांकि वास्तव में उचित होने के लिए, इसे दशमलव से बाइनरी स्ट्रिंग में परिवर्तित करना होगा, बिट फ़ील्ड के लिए काम करने के लिए एक चरित्र से)।

संपादित करें:
एक काफी पुरानी कहावत है कि यह बदल गया है, तो एक MySQL उन्नयन सब कुछ अधिक अपेक्षित तरीके से कर सकता है स्रोत मिला: http://gphemsley.wordpress.com/2010/02/08/php-mysql-and-the-bit-field-type/

2

आप अहस्ताक्षरित को बीआईटी क्षेत्र डाली कर सकते हैं।

SELECT CAST(hasMultipleColors AS UNSIGNED) AS hasMultipleColors from pumps where id = 1 

यह hasMultipleColors के मूल्य के आधार पर 1 या 0 वापस करेगा।

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