मुझे MySQL में UNSIGNED और SIGNED INT का उपयोग कब करना चाहिए?


102

मुझे MySQL में UNSIGNED और SIGNED INT का उपयोग कब करना चाहिए? क्या उपयोग करना बेहतर है या यह सिर्फ व्यक्तिगत पसंद है? क्योंकि मैंने देखा है कि यह इस तरह से इस्तेमाल किया जाता है;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

तथा

id INT(11) NOT NULL AUTO_INCREMENT

4
नकारात्मक पीके बहुत मायने नहीं रखता है
झटके

जवाबों:


165

UNSIGNEDकेवल सकारात्मक संख्या (या शून्य) संग्रहीत करता है। दूसरी ओर, हस्ताक्षर नकारात्मक संख्याओं को संग्रहीत कर सकते हैं (यानी, नकारात्मक चिह्न हो सकता है )।

यहां प्रत्येक INTEGERप्रकार के मानों की श्रेणियों की तालिका दी जा सकती है:

MySQL INTEGER प्रकार और लंबाई
स्रोत: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDपर्वतमाला 0के लिए nहै, जबकि के बारे में से पर्वतमाला पर हस्ताक्षर किए -n/2के लिए n/2

इस मामले में, आपके पास एक AUTO_INCREMENTआईडी कॉलम है, इसलिए आपके पास नकारात्मक नहीं होंगे। इस प्रकार, उपयोग करें UNSIGNED। यदि आप कॉलम के UNSIGNEDलिए उपयोग नहीं करते हैं AUTO_INCREMENT, तो आपका अधिकतम संभव मूल्य आधा अधिक होगा (और मूल्य सीमा का नकारात्मक आधा अप्रयुक्त हो जाएगा)।


16
हालाँकि, ध्यान दें कि UNSIGNEDयह MySQL-specific है न कि एक मानक SQL सुविधा। इसका मतलब है कि उपयोग UNSIGNEDकरने से एक अलग RDBMS के भविष्य के प्रवासन को अधिक जटिल बनाया जा सकता है या SQLAlchemy जैसे मानक SQL को लक्षित करने वाले सॉफ़्टवेयर पुस्तकालयों का उपयोग करते समय आप कठिनाइयों का कारण बन सकते हैं। मुझे लगता है कि यह उत्तर का एक हिस्सा होना चाहिए।
मेरासेव


4

मूल रूप से UNSIGNED, आप पूर्णांक के लिए अपने आप को दोगुना स्थान दे रहे हैं क्योंकि आप स्पष्ट रूप से निर्दिष्ट करते हैं कि आपको नकारात्मक संख्याओं की आवश्यकता नहीं है (आमतौर पर क्योंकि आपके द्वारा संग्रहीत मूल्य कभी भी नकारात्मक नहीं होंगे)।


1

मैं विपिन cp से सहमत नहीं हूँ ।

सच यह है कि संकेत का प्रतिनिधित्व करने के लिए पहले बिट का उपयोग किया जाता है। लेकिन 1 नकारात्मक के लिए है और 0 सकारात्मक मूल्यों के लिए है। अधिक नकारात्मक मूल्यों को अलग-अलग तरीके से कोडित किया जाता है (दो का पूरक)। TINYINT के साथ उदाहरण:

The sign bit
|
1000 0000b = -128d  
...  
1111 1101b = -3d  
1111 1110b = -2d  
1111 1111b = -1d  

0000 0000b = 0d  
0000 0001b = 1d  
0000 0010b = 2d  
...  
0111 1111b = 127d  

1

नकारात्मक पूर्णांक मान के लिए, SIGNEDका उपयोग किया जाता है और गैर-नकारात्मक पूर्णांक मान के UNSIGNEDलिए उपयोग किया जाता है। यह हमेशा UNSIGNEDएक प्राथमिक कुंजी के रूप में आईडी के लिए उपयोग करने का सुझाव दिया ।


0

एक चीज जो मैं जोड़ना चाहूंगा signed int, एक में , जो है default value in mysql, 1 bitका प्रतिनिधित्व करने के लिए उपयोग किया जाएगा sign-1 for negative and 0 for positive. इसलिए यदि आपका आवेदन केवल सकारात्मक मूल्य सम्मिलित करता है, तो इसे बिना बताए बेहतर होना चाहिए।


0

यदि आप जानते हैं कि आप किस प्रकार के नंबर स्टोर करने जा रहे हैं, तो आप अपने अनुसार चुन सकते हैं। इस मामले में आपकी 'आईडी' है जो कभी भी नकारात्मक नहीं हो सकती। तो आप अहस्ताक्षरित int का उपयोग कर सकते हैं। हस्ताक्षरित int की सीमा: -n / 2 से + n / 2 की संख्या अहस्ताक्षरित int: 0 से n तो आपके पास उपलब्ध सकारात्मक संख्या की दोगुनी है। तदनुसार चुनें।


0

मुझे लगता है, UNSIGNEDकिसी चीज़ को संग्रहीत करने का सबसे अच्छा विकल्प होगा time_duration(जैसे: resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)मिनट या घंटे या सेकंड प्रारूप में मूल्य जो निश्चित रूप से एक नकारात्मक संख्या होगी

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