MySQL में बूलियन मूल्यों के लिए बूलियन बनाम टिनीट (1)


124

बुलियन मूल्यों के लिए MySQL डेटाबेस में किस कॉलम का उपयोग करना सबसे अच्छा है? मैं उपयोग booleanकरता हूं लेकिन मेरे सहयोगी उपयोग करते हैं tinyint(1)


3
ऐसा लगता है कि MySQL पारदर्शी booleanरूप से व्यवहार करता है tinyint(1)। आप उपयोग कर सकते हैं तो boolean, trueऔर falseके रूप में और MySQL व्यवहार करता है उन्हें tinyint(1), 1और 0
ADTC

एक और मामला Y & N के साथ char 1 है जो कुछ लोगों द्वारा तेज़ माना जाता है।
जोन

जवाबों:


153

ये डेटा प्रकार पर्यायवाची हैं।


6
मैं यह नहीं कहूंगा कि डेटा टाइप पर्यायवाची हैं - टिनींट (1) बूल के समान है, लेकिन टिनींट और बूल समान नहीं हैं। माइनर पॉइंट, लेकिन आपके जवाब ने मुझे पहली बार पढ़ा जब मैंने इसे पढ़ा
काइल चड्ढा

2
इस सवाल का जवाब नहीं है। हालांकि यह सच है कि टॉलिंट (1) कार्यात्मक रूप से बूल के समान है, ओपी ने पूछा कि उपयोग करने के लिए सबसे अच्छा क्या है। @Dj_segfault द्वारा जवाब एक उचित काम करता है जो यह बताता है कि बूलियन मूल्य को संग्रहीत करते समय बूल को टिंटिंट (1) पर क्यों पसंद किया जाना चाहिए।
काइल मॉर्गन

87

मैं यहां एक अलग दृष्टिकोण लेने जा रहा हूं और सुझाव दूंगा कि यह आपके साथी डेवलपर्स के लिए आपके कोड को समझने के लिए उतना ही महत्वपूर्ण है जितना कि यह कंपाइलर / डेटाबेस के लिए है। बूलियन का उपयोग टिंटिंट का उपयोग करने के रूप में एक ही काम कर सकता है, हालांकि इसका शब्दार्थ यह बताने का लाभ है कि आपका इरादा क्या है, और यह कुछ के लायक है।

यदि आप एक टिंटंट का उपयोग करते हैं, तो यह स्पष्ट नहीं है कि आपके द्वारा देखे जाने वाले एकमात्र मान 0 हैं और 1. एक बूलियन हमेशा सही या गलत है।


35

booleanMySQL में एक विशिष्ट डेटा टाइप नहीं है; यह केवल एक पर्यायवाची है tinyintइस पृष्ठ को MySQL मैनुअल में देखें

व्यक्तिगत रूप से मैं सुझाव दूंगा कि छोटेपन को प्राथमिकता के रूप में इस्तेमाल करें, क्योंकि बूलियन वह नहीं करता है जो आप सोचते हैं कि यह नाम से करता है, इसलिए यह संभावित रूप से भ्रामक कोड के लिए बनाता है। लेकिन एक व्यावहारिक स्तर पर, यह वास्तव में कोई फर्क नहीं पड़ता - वे दोनों एक ही काम करते हैं, इसलिए आप या तो उपयोग करके कुछ भी नहीं खो रहे हैं या खो रहे हैं।


8

एनम का उपयोग करें अपनी आसान और सबसे तेजी से

मैं एनम या टिनीट (1) की सिफारिश नहीं करूँगा क्योंकि बिटिन (1) को बूलियन मान को संग्रहीत करने के लिए केवल 1 बिट की आवश्यकता है जबकि टिनींट (1) को 8 बिट्स की आवश्यकता है।

संदर्भ

MySQL में बूलियन मूल्यों के लिए टिनिटम बनाम एनयूएम (0, 1)


हम enum का उपयोग नहीं कर सकते हैं क्योंकि हमारे डेटाबेस
tom

11
यदि आप InnoDB का उपयोग कर रहे हैं, तो बिट टिंट के रूप में अधिक स्थान का उपयोग करके बिट समाप्त होता है। से उच्च निष्पादन MySQL (percona लोग) "InnoDB दुकान छोटी से छोटी पूर्णांक प्रकार बड़ा पर्याप्त रूप में प्रत्येक [बिट] स्तंभ बिट्स को रोकने के लिए है, तो आप कोई संग्रहण स्थान नहीं सहेजें [एस]।" एकमात्र लाभ यह है कि यदि आप BIT (morethan1) कॉलम में कई बूलियन मान संग्रहीत कर रहे हैं। इसलिए यदि आपके पास केवल एक बूलियन क्षेत्र है, तो टिनीट का उपयोग करना इनोबीडी में बिट के समान है, और बेहतर है क्योंकि टिनीट के साथ आमतौर पर काम करना आसान होता है।
बिलमलार्की

MySQL के लिए सच नहीं है: BIT(M) - approximately (M+7)/8 bytesदेखें: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
जेन्स

6

हालांकि यह यह सच है boolऔर tinyint(1)कर रहे हैं कार्यात्मक समान, boolपसंदीदा विकल्प है क्योंकि यह तुम क्या करने की कोशिश कर रहे हैं की अर्थ अर्थ किया जाता है होना चाहिए। इसके अलावा, कई ओआरएम boolआपकी प्रोग्रामिंग भाषा के मूल बूलियन प्रकार में परिवर्तित हो जाएंगे ।


0

MySQL से कनेक्ट करने के लिए डैपर का उपयोग करते समय मेरा अनुभव यह है कि इससे कोई फर्क नहीं पड़ता । मैंने निम्नलिखित स्क्रिप्ट का उपयोग करके एक अशक्त बिट (1) को एक अशक्त टॉलिंट (1) में बदल दिया:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

फिर डैपर ने अपवादों को फेंकना शुरू कर दिया। मैंने स्क्रिप्ट से पहले और बाद के अंतर को देखने की कोशिश की। और देखा कि बिट (1) टिंटिंट (1) में बदल गया था।

मैं फिर भागा:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

जिससे समस्या हल हो गई।

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