कौन सा MySQL डेटा बूलियन मूल्यों को संग्रहीत करने के लिए उपयोग करने के लिए टाइप करता है


1207

चूंकि MySQL के पास कोई 'बूलियन' डेटा प्रकार नहीं है, इसलिए MySQL में सही / गलत जानकारी संग्रहीत करने के लिए आप किस डेटा प्रकार का 'दुरुपयोग' करते हैं?

विशेषकर PHP स्क्रिप्ट के लिए लिखने और पढ़ने / के संदर्भ में।

समय के साथ मैंने कई दृष्टिकोणों का उपयोग और देखा है:

  • टिनीट, वर्चर फ़ील्ड जिसमें मान 0/1 है,
  • '0' / '1' या 'सही' / 'असत्य' स्ट्रिंग्स वाले varchar फ़ील्ड्स
  • और अंत में दो विकल्प 'सही' / 'गलत' वाले फील्ड्स को एनम करें।

उपरोक्त में से कोई भी इष्टतम नहीं लगता है। मैं टिनींट 0/1 वैरिएंट को पसंद करता हूं, क्योंकि PHP में ऑटोमैटिक टाइप कन्वर्जन मुझे बूलियन वैल्यू देता है।

तो आप किस डेटा प्रकार का उपयोग करते हैं? क्या बूलियन मूल्यों के लिए डिज़ाइन किया गया एक प्रकार है जिसे मैंने अनदेखा कर दिया है? क्या आप एक प्रकार या किसी अन्य का उपयोग करके कोई लाभ / हानि देखते हैं?


217
जो कोई भी इस प्रश्न के पुराने उत्तरों को पढ़ रहा है, उसे यह समझने की आवश्यकता है कि MySQL ने संस्करण 5 में थोड़ा डेटाटाइप जोड़ा है। उस जानकारी का उपयोग करें जैसा आप कर सकते हैं। dev.mysql.com/doc/refman/5.0/en/bit-type.html
smp7d


7
MYSQL बूलियन प्रकार के वर्तमान संस्करण के लिए उपलब्ध है- dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html इसे जांचें। उस मान के अनुसार शून्य को झूठा माना जाता है
DevT

7
bit(1)एक्सेल में आयात करने के लिए सा सा **। tinyint(1)काम पर स्विच कर रहा है।
सेस टिम्मरमैन

8
अब हमारे पास 5 साल बाद बूलियन है
V-SHY

जवाबों:


1232

MySQL 5.0.3 और उच्चतर के लिए, आप उपयोग कर सकते हैं BIT। मैनुअल कहता है:

MySQL 5.0.3 के रूप में, बिट डेटा प्रकार का उपयोग बिट-फ़ील्ड मानों को संग्रहीत करने के लिए किया जाता है। बीआईटी (एम) का एक प्रकार एम-बिट मूल्यों के भंडारण को सक्षम करता है। M 1 से 64 तक हो सकता है।

अन्यथा, MySQL मैनुअल के अनुसार आप बूल और बूलियन का उपयोग कर सकते हैं जो इस समय एलियन के टिनींट (1) में हैं:

बूल, बूलियन: ये प्रकार टिनिट (1) के पर्यायवाची हैं । शून्य का मान गलत माना जाता है। गैर-शून्य मानों को सच माना जाता है।

MySQL में यह भी कहा गया है कि:

हम भविष्य के MySQL रिलीज में, मानक SQL के अनुसार पूर्ण बूलियन प्रकार की हैंडलिंग को लागू करने का इरादा रखते हैं।

संदर्भ: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html


11
हाँ, मैं इस (या) के लिए जाना चाहता हूँ या संदर्भ के आधार पर 'Y' / 'N' या 'T' / 'F' इत्यादि स्टोर कर सकता हूँ। एक छोटे पूर्णांक प्रकार का उपयोग करने का लाभ यह है कि आपको RDBMS-es
Roland Bouman

36
चार के लिए जा रहे हैं, PHP में कम से कम, अधिक कोड का नेतृत्व करेंगे क्योंकि !$booleanआगे की प्रक्रिया के बिना कभी भी ठीक से मूल्यांकन नहीं होगा।
मिल्ड फज

10
@Pererier कुछ भी नहीं आप अपने आप को गूगल नहीं कर सकते, लेकिन ठीक है, मैं काट लूंगा। सबसे पहले, कृपया data0type.h पर एक नज़र डालें। कृपया ध्यान दें कि innodb मूल रूप से BIT प्रकार को वहां परिभाषित नहीं करता है। यदि यह आपके द्वारा बताए गए तरीके से बीआईटी क्षेत्रों का इलाज करेगा, तो निश्चित रूप से हमें इसके अस्तित्व के कुछ संकेत मिलेंगे। दूसरे, mysqlperformanceblog.com/2008/04/23/… पढ़ें । और BIT क्षेत्रों के साथ "मार्कटेल" के अद्भुत MySQL क्लाइंट को अद्भुत बनाने में संकोच न करें। वे जो लेख में कोई संदेह नहीं है चूक के लिए काम में आ जाएगा।
रोलैंड बोमन

9
जब मैं मानक mysql कमांड लाइन क्लाइंट बिट फ़ील्ड से एक चयन करता हूं तो पूरी तरह से खाली दिखाई देता है। इस वजह से मैं टिनिट (1) को पसंद करता हूं।
उपयोगकर्ता

8
@MikePurcell मुझे पूछने से नफरत है लेकिन आप auto_incrementबूलियन मान का प्रतिनिधित्व करने वाले कॉलम पर क्यों चाहेंगे ?
क्रिस हेस

248

BOOLऔर BOOLEANपर्यायवाची हैं TINYINT(1)। शून्य है false, कुछ और भी है true। अधिक जानकारी यहाँ


7
यह (1)निर्धारित करने से अधिक कुछ नहीं है कि मूल्य कैसे प्रदर्शित किया जाता है, यदि आप भंडारण आकार के बारे में सचेत हैं तो आप BITइसके बजाय उपयोग करना चाहते हैं
JamesHalsall

35
@JamesHalsall: वास्तव में, BIT(1)और TINYINT(1)दोनों भंडारण के एक बाइट का उपयोग करेंगे। MySQL 5.0.3 तक, BITवास्तव में इसके लिए एक पर्याय था TINYINT। MySQL के बाद के संस्करणों ने BIT के कार्यान्वयन को बदल दिया। लेकिन कार्यान्वयन परिवर्तन के साथ भी, BITडेटाटाइप (कम से कम InnoDB-MyISAM के साथ) के लिए अभी भी कोई "संग्रहण आकार" लाभ नहीं है ; अन्य भंडारण इंजन जैसे NDB में कई BIT स्तंभ घोषणाओं के लिए कुछ भंडारण अनुकूलन हो सकता है।) बड़ा मुद्दा यह है कि कुछ क्लाइंट। पुस्तकालयों ने पहचान नहीं की है या उचित रूप से दिए गए BITडेटाटाइप स्तंभों को संभालते हैं। एक TINYINTबेहतर काम करता है।
spencer7593

5
MySQL 5.0 मैनुअल स्पष्ट रूप से कहता है कि एक बूलियन मान या तो 1 या 0. है "वाक्यांश" और कुछ भी true"सत्य नहीं है।
वाल्टर

7
@Walter: यह वास्तव में सच है, स्पष्टीकरण में कुछ कमी है। संक्षेप में, बूलियन संदर्भ में, एक अभिव्यक्ति NULL, FALSE या TRUE का मूल्यांकन कर सकती है। MySQL स्टेटमेंट में, बूलियन संदर्भ में मूल्यांकन किए गए एक अभिव्यक्ति को पहले पूर्णांक के रूप में मूल्यांकन किया जाता है (दशमलव और फ्लोट मान गोल होते हैं, स्ट्रिंग को सामान्य quirky तरीके से परिवर्तित किया जाता है MySQL स्ट्रिंग को पूर्णांक में परिवर्तित करता है)। एक NULL जाहिर है NULL (न ही TRUE और न ही FALSE)। 0 का पूर्णांक मान FALSE के रूप में संभाला जाता है, और किसी भी अन्य पूर्णांक मान (1, 2, -7, आदि) TRUE का मूल्यांकन करता है। अनुकूलता के लिए, हम TINYINT बूलियन के तर्क / हैंडलिंग की नकल करते हैं
spencer7593

4
@Walter: यह परीक्षण करना आसान है, उदा SELECT 'foo' AS bar FROM dual WHERE -7। अभिव्यक्ति -7 का मूल्यांकन बूलियन संदर्भ में किया जाता है, और क्वेरी एक पंक्ति लौटाती है। हम 0, या किसी भी अभिव्यक्ति के साथ परीक्षण कर सकते हैं जो पूर्णांक मान 0 का मूल्यांकन करता है, और कोई पंक्ति वापस नहीं की जाती है। यदि WHERE क्लॉज़ में अभिव्यक्ति शून्य के अलावा किसी भी गैर-शून्य पूर्णांक मान का मूल्यांकन करती है, तो अभिव्यक्ति TRUE है। (मेरा मानना ​​है कि दशमलव और फ्लोट मानों को पूर्णांक के लिए "गोल" मिलता है, उदाहरण के लिए WHERE 1/3मूल्यांकन करता है WHERE 0। हमें उसी परिणाम के साथ मिलता है WHERE 'foo', क्योंकि स्ट्रिंग 'foo'पूर्णांक मान का मूल्यांकन भी करता है 0.
spencer7593

71

यह एक सुंदर समाधान है जिसकी मैं काफी सराहना करता हूं क्योंकि यह शून्य डेटा बाइट्स का उपयोग करता है:

some_flag CHAR(0) DEFAULT NULL

इसे सही पर सेट करने के लिए, सेट करें some_flag = ''और इसे गलत पर सेट करें, सेट करें some_flag = NULL

फिर सत्य का परीक्षण करने के लिए, जाँच करें कि some_flag IS NOT NULL, और असत्य के लिए परीक्षण करने के लिए, अगर some_flag जाँचें IS NULL

(यह विधि जॉन वारेन लेंटेज़, बैरन श्वार्ट्ज और अरजेन लेंटेज़ द्वारा "उच्च प्रदर्शन MySQL: ऑप्टिमाइज़ेशन, बैकअप, प्रतिकृति और अधिक" में वर्णित है।)


3
फैंसी ट्रिक! अगर यह MySQL <5 के साथ काम कर रहा है और शायद BIT की तुलना में हल्का पदचिह्न भी मददगार है, हालांकि अधिवेशन और थोड़े कम गणना ओवरहेड (तर्क बनाम सटीक मान) के अनुपालन के प्रयास में, मैं कहूंगा कि BIT जाने का सबसे अच्छा तरीका है।
ज़मानट्स

59
'तेज़' हो सकता है, लेकिन यह डेटा को ऐसे बाधित करता है कि किसी भी नए डेवलपर को पता नहीं होगा कि स्तंभ क्या है।
रिचथोफेन

5
यह BIT (1)
ITS अलास्का

25
सौभाग्य से एक ORM को अच्छी तरह से इस पर नक्शा करने के लिए मिल रहा है।
क्रेग लैबेंजी

4
मैं @Richthofen से सहमत हूं, और ऐसी स्थिति की कल्पना करना मुश्किल है जिसमें मैं कभी इस समाधान का उपयोग करने की वकालत करूं। हालांकि, यदि इसका उपयोग किया जाना है, तो COMMENTकॉलम की परिभाषा में एक के रूप में निर्दिष्ट करना जो NULLगलत ''इंगित करता है और इंगित करता है कि भविष्य की समझ का समर्थन करने के लिए कुछ बहुत ही छोटे तरीके से जा सकते हैं।
अर्ग्यल

34

यदि आप BOOLEAN प्रकार का उपयोग करते हैं, तो यह TINYINT (1) में बदल दिया जाता है। यह सबसे अच्छा है अगर आप मानकीकृत एसक्यूएल का उपयोग करना चाहते हैं और इस बात का बुरा नहीं मानते कि क्षेत्र में आउट ऑफ रेंज वैल्यू हो सकती है (मूल रूप से ऐसा कुछ जो 0 नहीं है वह 'सत्य' होगा)।

ENUM ('गलत', 'सत्य') आपको अपनी SQL में स्ट्रिंग्स का उपयोग करने देगा, और MySQL इस क्षेत्र को आंतरिक रूप से एक पूर्णांक के रूप में संग्रहीत करेगा जहां 'झूठी' = 0 और 'True' = 1 क्रम के आधार पर Enum निर्दिष्ट है ।

MySQL 5+ में आप 1-बिट संख्यात्मक प्रकार को इंगित करने के लिए BIT (1) फ़ील्ड का उपयोग कर सकते हैं। मुझे विश्वास नहीं है कि यह वास्तव में भंडारण में किसी भी कम जगह का उपयोग करता है, लेकिन फिर से आपको 1 या 0 के संभावित मूल्यों को बाधित करने की अनुमति देता है।

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


8
ENUM से संबंधित आपकी टिप्पणी सत्य नहीं है: CAST (yourenumcol AS UNSIGNED) आज़माएँ और आप देखेंगे कि झूठी 1 होगी, और यह सच होगा कि 2. ENUM के साथ एक और समस्या यह है कि इसे सम्मिलित करना बहुत आसान है '' (रिक्त स्ट्रिंग) ) का है। मैं इसका इस्तेमाल करने से मना कर दूंगा।
रोलैंड बुमैन

4
मेरे अनुभव में, PHP कोड से BIT (1) फ़ील्ड का उपयोग करना थोड़ा परेशानी भरा था। TINYINT (1) बहुत आसान था और अधिक पठनीय कोड का उत्पादन करता था।
एम-पेरोर

1
@ एम-पेरोर - "PHP कोड से BIT (1) फ़ील्ड का उपयोग करना थोड़ा कष्टप्रद था" ... कोई भी वाक्य इरादा नहीं था। :) लेकिन, हाँ, मैं सहमत हूँ। मुझे याद है TINYINT (1) बहुत आसान है, ... सिर्फ इसलिए याद नहीं किया जा सकता। किसी और को इस पर विचार है? बीआईटी (1) सतह पर अच्छे लगते हैं क्योंकि आप 0 या 1 तक सीमित कर सकते हैं। मुझे लगता है कि बीआईटी को कभी-कभी द्विआधारी डेटा (प्रोग्रामिंग भाषा और चालक / पुस्तकालय के आधार पर) के रूप में व्याख्या किया गया था; जबकि, TINYINT को एक संख्या की तरह अधिक व्यवहार किया गया था।
बीएमएनर

2
@ बीएमएनआर - हाहा, यह वास्तव में अनायास ही था, ध्यान नहीं दिया :) लेकिन वास्तव में, अगर मुझे याद है कि बिट क्षेत्र को कुछ द्विआधारी के रूप में व्याख्या किया गया था, जबकि टिनींट को संख्या के रूप में व्यवहार करना आसान था और उस वजह से, आसान (बूलियन) अभिव्यक्ति में उपयोग करें।
एम-पेरोर

34

इस सवाल का जवाब दिया गया है, लेकिन मुझे लगा कि मैं अपने $ 0.02 में फेंक दूंगा। मैं अक्सर CHAR(0), जहां का उपयोग करता हूं '' == true and NULL == false

से mysql डॉक्स :

CHAR(0)यह भी काफी अच्छा है जब आपको एक ऐसे स्तंभ की आवश्यकता होती है जो केवल दो मान ले सकता है: एक स्तंभ जिसे CHAR(0) NULLकेवल एक बिट पर रखा जाता है और केवल मान NULLऔर ''(रिक्त स्ट्रिंग) ले सकता है।


16
मिमी, यह मुसीबत के लिए पूछ रहा है जैसे कि आप मेरे रूप में। मेरा मतलब है कि भाषा के आधार पर, NULL और '' (उदाहरण के लिए PHP) के बीच अंतर को स्पष्ट नहीं करना बहुत आसान हो सकता है।
रोलैंड बुमैन

3
बचत स्थान (बूलियन का प्रतिनिधित्व करने के लिए उपयोग किए जाने वाले बाइट्स की संख्या) के संदर्भ में, यह दृष्टिकोण एक स्पष्ट विजेता है। यह टिनिट पर एक बाइट बचाता है। नकारात्मक पक्ष (जैसा कि कुछ टिप्पणियां बताती हैं) यह है कि कुछ क्लाइंट को NULL और खाली स्ट्रिंग के बीच अंतर करने में कठिनाई हो सकती है। यहां तक ​​कि कुछ संबंधपरक डेटाबेस (जैसे ओरेकल) एक शून्य-लंबाई स्ट्रिंग और एक नल के बीच अंतर नहीं करते हैं।
spencer7593

3
यह बहुत चालाक है! मैं चालाक कोड लिखता था, अब मैं प्लेग की तरह इससे बचता हूं। मैं अब चाहता हूं कि मेरा कोड सही व्यवहार न होकर क्रिस्टल स्पष्ट आशय का हो। मेरी सलाह? यदि आप किसी ऐसे व्यक्ति को भ्रमित करना चाहते हैं, जिसे कोड / डेटाबेस का समर्थन करना है, तो ही ऐसा करें। उदाहरण के लिए, PHP में दोनों ''और nullमिथ्या मूल्य हैं।
सीजे डेनिस

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

18

मैं मैसकल में बुलियन मूल्यों को संग्रहीत करने के लिए टिनिनेट (1) का उपयोग करता हूं।

मुझे नहीं पता कि इसका उपयोग करने का कोई फायदा है या नहीं ... लेकिन अगर मैं गलत नहीं हूं, तो mysql बूलियन (BOOL) को स्टोर कर सकता है और इसे एक टिंटिन (1) के रूप में संग्रहीत करता है

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html


17

बिट केवल विभिन्न बाइट विकल्प (स्मॉलिंट, एनम, चार (1)) पर लाभप्रद है यदि आपके पास बहुत सारे बूली फ़ील्ड हैं। एक बिट क्षेत्र अभी भी एक पूर्ण बाइट लेता है। दो बिट फ़ील्ड उसी बाइट में फिट होते हैं। तीन, चार, पांच, छह, सात, आठ। जिसके बाद वे अगली बाइट भरने लगते हैं। अंततः बचत बहुत कम होती है, हजारों अन्य अनुकूलन हैं जिन पर आपको ध्यान देना चाहिए। जब तक आप भारी मात्रा में डेटा के साथ काम नहीं कर रहे हैं, उन कुछ बाइट्स में बहुत कुछ नहीं जोड़ा जाएगा। यदि आप PHP के साथ बिट का उपयोग कर रहे हैं, तो आपको अंदर और बाहर जाने वाले मानों को टाइप करना होगा।


1
टाइपकास्टिंग टिप्पणी के लिए +1। प्रोग्रामिंग भाषाओं के साथ काम करने के दौरान इसे जोड़ने के लिए संगतता के पक्ष में आलसी प्रोग्रामिंग तकनीकों का उपयोग करने से बचें। बस बराबर के बजाय समान ऑपरेटरों का उपयोग करें। PHP के मामले में अगर ($ var == "") 0, गलत, अशक्त, अपरिभाषित और "" के लिए सही होगा। सभी मूल्यों का परीक्षण करने के लिए इसका उपयोग करना सबसे अच्छा है अगर (सही === खाली ($ var)) क्योंकि यह अपरिभाषित त्रुटियों से भी बच जाएगा। यदि आप (is_int ($ var) && $ var === 0) के साथ काम कर रहे डेटा प्रकार को सत्यापित करना चाहते हैं या उसे टाइप करने के लिए टाइप करें, तो यह कार्य के लिए एक विशिष्ट डेटा प्रकार (int) $ var होने के लिए बाध्य करता है।
fyrye

@ क्या यह MySQL के लिए सही है, उसी हद तक यह MSSQL के लिए सही है? मैं एक नए एप्लिकेशन को माइग्रेट कर रहा हूं जो MSSQL से MySQL तक अभी तक उत्पादन में नहीं गया है। मैं PHP का उपयोग नहीं कर रहा हूं, बल्कि C # को जावा 8 में परिवर्तित कर रहा हूं। यह देखते हुए कि जावा एक जोरदार टाइप की गई भाषा है जिसे मैं टाइप हैंडलिंग से चिंतित नहीं हूं ... बस सभी बिट्स झंडे एक से 8 झंडे तक बढ़ जाएंगे। 1 बाइट प्रत्येक ध्वज TINYINT (1) दिया। क्या आप MySQL के लिए इस विषय पर कोई दस्तावेज जानते हैं?
ज़ैक जैन्सन

1
@ थोर कुछ गहन शोध करते हुए यह स्पष्ट करते हैं कि उत्तर क्या होना चाहिए। परिवर्तन होता है और हमने इस हैंडलिंग में सुधार देखा है। अपनी भाषा को जानें जो एप्लिकेशन लेयर / डेटा एक्सेस लेयर में होगी और आपके पुस्तकालयों का समर्थन जानती है। मैं वर्तमान में जावा का उपयोग कर रहा हूं और बीआईटी (1) हाइबरनेट और जेडीबीसी के उपयोग जैसे पुस्तकालयों के लिए इस समय अनुशंसित विकल्प है। यहाँ URL है [तालिका 5.2 देखें]: dev.mysql.com/doc/connector-j/en/…
ज़ैक जांनसेन

12

जब तक आपका संसाधन थोड़ा सा डेटा टाइप करता है, तब तक MySQL इम्प्लीमेंट करता है, अगर आपकी प्रोसेसिंग सही मायने में स्पेस और / या समय के लिए होती है, जैसे कि हाई वॉल्यूम ट्रांजेक्शन के साथ, एक TINYINT फ़ील्ड बनाएं bit_flags अपने सभी बूलियन वेरिएबल्स के लिए किया गया , और मास्क और अपने SQL में बिट को शिफ्ट करें। क्वेरी।

उदाहरण के लिए, यदि आपका बायीं ओर का हिस्सा आपके बूल क्षेत्र का प्रतिनिधित्व करता है, और 7 सबसे दाहिने बिट्स कुछ नहीं का प्रतिनिधित्व करते हैं, तो आपका bit_flagsक्षेत्र 128 (बाइनरी 10000000) के बराबर होगा। मास्क (छिपाएं) सात सबसे दाहिने बिट्स (बिटवाइज़ ऑपरेटर का उपयोग करके &), और 8 बिट बिट को दाईं ओर शिफ्ट करें, साथ समाप्त कर रहा है 00000001। अब संपूर्ण संख्या (जो, इस मामले में, 1 है) आपका मान है।

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

आप परीक्षण के रूप में इस तरह के बयान चला सकते हैं

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

आदि।

चूंकि आपके पास 8 बिट्स हैं, इसलिए आपके पास एक बाइट से संभावित 8 बूलियन चर हैं। कुछ भविष्य के प्रोग्रामर हमेशा अगले सात बिट्स का उपयोग करेंगे, इसलिए आपको मास्क लगाना चाहिए । बस बदलाव मत करो, या आप भविष्य में अपने और दूसरों के लिए नरक का निर्माण करेंगे। सुनिश्चित करें कि आपके पास MySQL अपने मास्किंग और शिफ्टिंग है - यह वेब-स्क्रिप्टिंग भाषा (PHP, ASP, आदि) होने की तुलना में काफी तेज होगा। इसके अलावा, सुनिश्चित करें कि आप MySQL टिप्पणी क्षेत्र में अपने लिए एक टिप्पणी रखते हैंbit_flags क्षेत्र के ।

इस विधि को लागू करते समय आपको ये साइटें उपयोगी लगेंगी:


7
यह भविष्य के प्रोग्रामरों के इरादे को आगे बढ़ाने के लिए एक भयानक तरीके से लगता है। यकीन है कि 7 बाइट्स को बचाने के लिए बहुत परेशानी की तरह लगता है (यह मानते हुए कि आप एक ही टेबल में सभी 8 बूल का उपयोग कर रहे हैं!)
yep

@ हां, इसमें कोई आपत्ति नहीं है! तालिका के प्रत्येक क्षेत्र को समझाते हुए प्रलेखन और MySQL टिप्पणी लिखें (उत्तर के रूप में)! सुझाए गए MySQL अनमास्किंग की रणनीति ठोस दिखती है और 16 अलग-अलग बूलियन फ़ील्ड्स को स्टोर करना पड़ता है, जिनमें से सिर्फ एक कॉलम के बजाय 16 कॉलम बेहतर होते हैं। यदि यह बिट हेरफेर का उपयोग करने में बहुत भ्रमित है और आप प्रत्येक बूलियन प्राप्त करने के लिए अपनी वेब-स्क्रिप्टिंग भाषा का उपयोग करना पसंद करते हैं, तो बस इसे एक के रूप में संग्रहीत करें VARCHARऔर कोड में अनमास्किंग प्रक्रिया करें (आपको इसे 8 फ़ील्ड तक सीमित करने की आवश्यकता नहीं है) ...
CPHPython

BITप्रकार से मौजूद है। देखें dev.mysql.com/doc/refman/8.0/en/bit-type.html
Dolmen

10

मैं शून्य, NULLS और '' सही ढंग से PHP, MySql और POST मानों के एक लूप को गोल करने की कोशिश से तंग आ गया, इसलिए मैं सिर्फ 'Yes' और 'No' का उपयोग करता हूं।

यह त्रुटिपूर्ण रूप से काम करता है और किसी ऐसे विशेष उपचार की आवश्यकता नहीं है जो स्पष्ट और आसान न हो।


17
यदि आप वास्तव में इस अधिक स्थान को बर्बाद करना चाहते हैं और प्रदर्शन में समझौता करना चाहते हैं, तो आप कम से कम CHAR (1) Y और N विकल्पों के साथ कर सकते हैं।
ILikeTacos

3
अधिकांश वास्तविक दुनिया की स्थितियों में 'नहीं' और सूचना की अनुपस्थिति के बीच एक वास्तविक अंतर होता है। उदाहरण के लिए, यदि आप उपयोगकर्ता द्वारा अभी तक 'नहीं' नहीं कहा गया है, तो आप डिफ़ॉल्ट रूप से एक चेकबॉक्स टिक कर सकते हैं। वास्तव में आप कितना स्थान सोचते हैं कि आप बचत कर रहे हैं, और एक झूठी और NULL के बीच अंतर करने के लिए आपको हर बार कितना प्रसंस्करण करना पड़ता है - यदि वास्तव में आप भी अंतर कर सकते हैं? संग्रहीत चित्रों और डिजिटल वीडियो की दुनिया में, अंतरिक्ष की बचत के बिट या दो पूरी तरह से अप्रासंगिक हैं, लेकिन स्पष्टता और कम प्रसंस्करण वास्तविक है।
ज्योफ केंडल

8
यह उत्तर गलत नहीं है क्योंकि यह काम करेगा और यह उतना बुरा नहीं है जितना लोग इसे देते हैं। अधिकांश परियोजनाओं के लिए (यानी: टेबल आकार <1mil पंक्तियाँ)। प्रदान किए गए समाधानों के बीच प्रदर्शन के अंतर नापाक होंगे। अगर 7 से 5 मिलीसेकंड में मेरी क्वेरी वापस आती है तो मैं शिकायत नहीं करूंगा ... अगर आपकी टेबल 10mil पंक्तियों में बढ़ रही हैं या अधिक उचित है, तो शायद यह पसंदीदा समाधान नहीं है।
ब्रैड

1
ENUM डेटा प्रकार का उपयोग करने के लिए मुझसे +1। मैं व्यक्तिगत रूप से इस संकेतन को पसंद करता हूं: ENUM ('y', 'n')। यह कॉम्पैक्ट है (बस एक बाइट लंबी), सहज और सभी बूलियन झंडे के लिए आवेदन-स्तर सम्मेलन के रूप में अच्छी लग रही है। आप इसे सीधे HTML फॉर्म फ़ील्ड के साथ उपयोग कर सकते हैं। उदाहरण के लिए PHP: <select name = "production"> <option value = "y" <? = $ production === 'y'? 'चयनित = "चयनित"': ''? >> हाँ </ विकल्प> <विकल्प मूल्य = "एन" <? = $ उत्पादन === 'एन'? 'चयनित = "चयनित"': ''; >> नहीं </ विकल्प> </ चयन>
व्लादो

2
लोल ने मेरी आँख खोली लेकिन मुझे कहना है @GeoffKendall सही है। एक टन मामलों में इष्टतम प्रदर्शन की कोई आवश्यकता नहीं है और जो भी विधि आपके लिए काम करती है वह सही विधि है।
मादामेन्यो

6

इस लिंक का उपयोग मैसकल में बुलियन डेटाटाइप के अनुसार, अनुप्रयोग उपयोग के अनुसार, यदि कोई केवल 0 या 1 को संग्रहीत करना चाहता है, तो बिट (1) बेहतर विकल्प है।


6
यह सच है कि BIT(1)केवल एक b'0'या b'1'मान को संग्रहीत करने की अनुमति देगा । BITडेटाटाइप के साथ सबसे बड़ा मुद्दा यह है कि विभिन्न क्लाइंट लाइब्रेरीज़ में डेटाटाइप के विविध प्रकार के विजिबिल हैंडलिंग होते हैं। विभिन्न SQL टूल्स (SQLyog, TOAD for MySQL, SQL Developer), "रिवर्स इंजीनियर" डेटाबेस मॉडल, और JDBC, PHP, पर्ल DBI जैसे विभिन्न क्लाइंट, और अच्छे उपाय के लिए व्यवहार की जाँच करें, कुछ MM चौखटे का परीक्षण करें ( हाइबरनेट, मायबैटिस, जेपीए)। उपयोग में आसानी के संदर्भ में, उपकरण / रूपरेखा संगतता / देशी समर्थन, TINYINT(1)स्पष्ट विजेता है।
spencer7593

हाँ। यह पूर्णता ऐप के लिए विचार किए जा रहे ढांचे पर निर्भर करता है। उदाहरण के लिए, PHP का फाल्कन ढांचा बिट डेटेटाइप
विडज़

रिकॉर्ड के लिए, MyBatis दोनों BITऔर का समर्थन करता है TINYINT। MyBatis की JdbcType क्लास देखें, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…
Lucky

1
@ विद मैं आपको बीआईटी (1) के उल्लेख के लिए एक प्लस देता हूं, लेकिन यह पढ़ने वाले डेवलपर्स को भी इंगित करेगा - अपनी भाषा जानिए जो एप्लिकेशन लेयर / डेटा एक्सेस लेयर में होगी और आपके पुस्तकालयों का समर्थन जानती है। मैं वर्तमान में जावा का उपयोग कर रहा हूं और बीआईटी (1) हाइबरनेट और जेडीबीसी के उपयोग जैसे पुस्तकालयों के लिए इस समय अनुशंसित विकल्प है। यहाँ URL [तालिका 5.2 देखें]: dev.mysql.com/doc/connector-j/en/…
ज़ैक जाॅनसेन

6

MySQL (8.0.16) और MariaDB (10.2.1) के बाद से दोनों ने CHECK बाधा को लागू किया, अब मैं इसका उपयोग करूंगा

bool_val TINYINT CHECK(bool_val IN(0,1))

आप केवल दुकान में सक्षम हो जाएगा 0, 1या NULL, साथ ही मान जो करने के लिए परिवर्तित किया जा सकता के रूप में 0या 1त्रुटियों की तरह बिना '1', 0x00, b'1'या TRUE/FALSE

यदि आप NULLs को अनुमति नहीं देना चाहते हैं, तो NOT NULLविकल्प जोड़ें

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

ध्यान दें कि यदि आप उपयोग करते हैं TINYINT, TINYINT(1)या वास्तव में कोई अंतर नहीं हैTINYINT(123)

यदि आप चाहते हैं कि आपका स्कीमा ऊपर की ओर संगत हो, तो आप इसका उपयोग BOOLया भी कर सकते हैंBOOLEAN

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

db <> फिडेल डेमो


enum (0, 1) के बारे में क्या
santiago arizti

3
@santiagoarizti ENUM(यह होना चाहिए enum('0', '1')- ध्यान दें: वे तार हैं) एक अच्छा विचार नहीं है। हैं भी कई मुद्दों है कि यह कैसे आंतरिक रूप से संग्रहीत किया जाता है, और कैसे गैर स्ट्रिंग मान इलाज कर रहे हैं की वजह से। उदाहरण के लिए। 0और FALSE संग्रहीत नहीं किया जा सकता। 1और TRUEबन जाते हैं '0'। और 2बन जाता है '1'
पॉल स्पीगल

सबसे अच्छा जवाब ... MySQL 8+ का उपयोग करने वालों के लिए
dolmen

2

यहाँ जवाबों को पढ़ने के बाद मैंने उपयोग करने का फैसला किया bit(1)और हाँ, यह किसी भी तरह से अंतरिक्ष / समय में बेहतर है, लेकिन थोड़ी देर के बाद मैंने अपना दिमाग बदल दिया और मैं फिर कभी इसका इस्तेमाल नहीं करूँगा। यह मेरे विकास को बहुत जटिल करता है, जब तैयार बयानों, पुस्तकालयों आदि (php) का उपयोग किया जाता है।

तब से, मैं हमेशा उपयोग करता हूं tinyint(1), काफी अच्छा लगता है।


3
यह समझाने के लिए कि किस तरह से यह आपके विकास को जटिल बनाता है?
चेज़ चैज़

@ChazyChaz यह SQL सर्वर जैसे कुछ अन्य dbs के विपरीत, 1/0 के बजाय सही / गलत होने की उम्मीद करता है। यह कभी-कभी अजीब स्थितियों को जन्म दे सकता है, जहां आपको लगता है कि आप इसे सच कर रहे हैं, लेकिन वास्तव में ऐसा नहीं होता है।
मैम्बे

0

आप बूलियन मान संग्रहीत करने के लिए BOOL, BOOLEAN डेटा प्रकार का उपयोग कर सकते हैं।

ये प्रकार टिनिट के लिए समानार्थी हैं (1)

हालांकि, बीआईटी (1) डेटा प्रकार एक बूलियन मूल्य (या तो सच [1] या गलत [0]) को स्टोर करने के लिए अधिक समझ में आता है, लेकिन जब आप डेटा को आउटपुट कर रहे हैं, तो TINYINT (1) के साथ काम करना आसान है। पर और MySQL और अन्य डेटाबेस के बीच अंतर को प्राप्त करने के लिए। आप इस उत्तर या थ्रेड को भी देख सकते हैं ।

MySQL भी BOOL, BOOLEAN डेटा प्रकार को TINYINT (1) में परिवर्तित करता है।

इसके अलावा, प्रलेखन पढ़ें

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