जब मैं इस तालिका में कोई संख्या सम्मिलित करता हूं तो मैं अग्रणी शून्य को कैसे संरक्षित करूं? [बन्द है]


10

मैंने एक टेबल में दो रिकॉर्ड डाले हैं।

create table num(id int)
insert into num values(0023)
insert into num values(23)
select * from num

जब मैं उन्हें क्वेरी करता हूं, तो वे सभी प्रदर्शित होते हैं 23। इसका मतलब है कि SQL सर्वर अग्रणी 0s को अनदेखा करता है। उसके पीछे क्या तंत्र है? जैसे ही मैंने उन्हें (यानी 0023और 23) सम्मिलित किया, मैं SQL सर्वर का मान कैसे लौटा सकता हूं ?


2
आप प्रमुख शून्य की परवाह क्यों करते हैं? यदि वे आपके सिस्टम के लिए सार्थक हैं, तो idप्रकार VARCHARया समान होना चाहिए ।
निक चम्मास

बिल्कुल कैसे आप 2323 या 023 या 0000000023 से अलग के रूप में डेटाबेस में एन्कोड किए जाने की उम्मीद करते हैं? वे सभी एक ही नंबर का प्रतिनिधित्व करते हैं। और int एक NUMBER डेटा प्रकार है। सर्वर के लिए "दशमलव शून्य की अग्रणी संख्या" मान संग्रहीत करने के लिए कोई जगह नहीं है।
एरिक

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

1
अग्रणी शून्य निहित हैं। इसके बजाय एक स्ट्रिंग का उपयोग करने के अलावा, यदि आपको एक विशिष्ट संख्या में अग्रणी शून्य की आवश्यकता है, तो यह अतिरिक्त जानकारी है जो एक इंट कॉलम में संग्रहीत है। एक विकल्प एक स्ट्रिंग कॉलम का उपयोग कर रहा है, लेकिन एक अन्य विकल्प किसी अन्य कॉलम या UI में अग्रणी शून्य की संख्या को संग्रहीत कर रहा है। उदाहरण के लिए, यदि UI हमेशा 4 अग्रणी अंकों के साथ प्रारूपित करता है, तो आपने यह जानकारी UI में संग्रहीत कर ली है। यदि आपको प्रत्येक रिकॉर्ड के लिए भिन्न होने के लिए # शून्य की आवश्यकता है और आप उस जानकारी को एक अलग फ़ील्ड में संग्रहीत कर सकते हैं।
डेव कजिनो

जवाबों:


27

0023कोई संख्या नहीं है। यह एक तार है। 23नंबर है। SQL सर्वर यह पहचानने में सक्षम है कि उन अतिरिक्त शून्य को संख्या को परिभाषित करने की आवश्यकता नहीं है, इसलिए यह उन्हें अनदेखा करता है। यदि आप आवेदन के लिए 0023 के रूप में मान प्राप्त करना चाहते हैं, तो मेरा सुझाव है कि आवेदन पक्ष पर प्रारूपण करना चाहिए। इस तरह से SQL सर्वर में संग्रहीत संख्या अभी भी एक संख्या है यदि आप इसके अलावा, एकत्रीकरण या अन्य गणना करना चाहते हैं। यदि आपको वास्तव में इसे ' 0023' के रूप में संग्रहीत करना है , तो आपको इसे एक चरित्र क्षेत्र में बदलने की आवश्यकता है; char, varchar, nvarchar, nchar।


यदि 0023 स्ट्रिंग है, तो मैं उस तालिका में मान कैसे डाल सकता हूं जिसे मैंने आईडी को इंट प्रारूप के रूप में परिभाषित किया है?
user8365

@ user8365 - या तो परिभाषित idके रूप में VARCHARया सिर्फ 23 की बजाय 0023 डालने
Lamak

5
@ user8365 - आप पूछ रहे हैं कि क्या आप SQL सर्वर को उस क्षेत्र की डोमेन अखंडता का उल्लंघन कर सकते हैं । आप नहीं कर सकते। यदि 0023एक स्ट्रिंग है तो इसे स्ट्रिंग के रूप में संग्रहीत करें। यदि ऐसा नहीं है, तो इसे एक INT के रूप में संग्रहीत करें और अग्रणी शून्य के बारे में भूल जाएं।
निक चम्मास

बिलकुल @NickChammas ने क्या कहा। आपके पास यहां कोई विकल्प नहीं है। 23 एक संख्या है, 0023 एक स्ट्रिंग है। यदि आप एक नंबर चाहते हैं, तो इसे एक नंबर मानें। जैसे मेरा उत्तर कहता है, यदि इसे एक संख्या की तरह क्रमबद्ध करना, जोड़ना, घटाना, गुणा करना, विभाजित करना, इत्यादि की तरह करना है, तो उसे एक संख्या की आवश्यकता होती है। कोई विकल्प नहीं। कोई तर्क नहीं। अग्रणी शून्य सिर्फ स्वरूपण है। ऐसा ऐप कोड या कहीं और करें।
ग्रांट फ्रेटी

@ मैं इस बात से सहमत नहीं हो सकता कि प्रमुख शून्य सिर्फ स्वरूपण हैं। वे किसी भी अंक प्रणाली में वैध हैं; हालाँकि, 0023b10 = 23b10; इसलिए, किसी भी संग्रहण प्रणाली को सभी अग्रणी शून्य को एन्कोडिंग न करके कुछ हद तक संपीड़न की सुविधा मिलती है। इसलिए, मौलिक रूप से हमारा प्रश्नकर्ता गलत प्रश्न पूछ रहा है। 0023 पूर्णांक क्यों नहीं है? यह एक पूर्णांक है! हमें सिर्फ प्रमुख अंकों के अनंत को सांकेतिक शब्दों में बदलना करने की आवश्यकता नहीं है क्योंकि यह इस तरह का प्रतिनिधित्व करता है।
ऑउटवायर

5

यह पहले से ही अन्य उत्तरों में कहा गया था कि 00023एक संख्या है; मैं केवल यह जोड़ना चाहता हूं कि आप कस्टम प्रारूप का उपयोग करके उस नंबर को दिखाने के लिए कंप्यूटेड कॉलम का उपयोग कर सकते हैं। उदाहरण के लिए,

create table num_table(id int not null primary key identity(1,1),
num int, leading_zeros smallint,
constraint chk_leading_zero_nonnegative check (leading_zero>=0),
num_formatted as replicate('0',coalesce(leading_zeros,0)) +cast(num as varchar(10)));
insert into num_table(num,leading_zeros) values(23,2) ;
select num_formatted from num_table; -- output '0023'

अच्छी बात है, बिल्कुल ध्यान देने योग्य है।
१०:०२

0

0023 एक संख्या है, लेकिन int और अन्य संख्या डेटा प्रकार अग्रणी शून्य स्टोर नहीं करते हैं क्योंकि ऐसा करने का कोई गणितीय कारण नहीं है।

यदि आपको अग्रणी शून्य स्टोर करने की आवश्यकता है, तो स्ट्रिंग डेटा प्रकार जैसे, चार, वर्चर आदि का उपयोग करें


1
यदि हम मानते हैं कि INTनिश्चित लंबाई (जैसे 32 बिट्स) और बाइनरी नोटेशन का उपयोग उन्हें स्टोर करने के लिए किया जाता है, तो अग्रणी शून्य वास्तव में संग्रहीत होते हैं। लेकिन वे आउटपुट में प्रदर्शित नहीं होते हैं।
ypercube y

@ypercube - सही है, लेकिन अग्रणी शून्य की संख्या बस 32 बिट्स को भरने के लिए आवश्यक है (जैसा कि उपयोगकर्ता-निश्चित के विपरीत)।
निक चम्मास

@ निक: हाँ, वहाँ कोई तर्क नहीं है। मुझे लगता है कि बात यह नहीं है कि अग्रणी शून्य संग्रहीत हैं या नहीं। यह है कि क्या एक ही संख्या के दो संस्करणों को डेटाटाइप में संग्रहीत किया जा सकता है, एक के साथ और एक अग्रणी शून्य के बिना।
ypercube y

लेकिन इसका कोई मतलब नहीं है। दो दशमलव अग्रणी शून्य का 32-बिट पूर्णांक में अग्रणी शून्य की संख्या से कोई संबंध नहीं है। दशमलव संख्या पर विचार करें - यह 15केवल हेक्साडेसिमल में एक अंक लेता है F। उनके पास पहले से ही "अग्रणी शून्य" की एक अलग संख्या है। 2147483647 10 अंक है, लेकिन हेक्स में केवल 7FFFFFFF या 8 अंक है।
एरिक

मौलिक रूप से, किसी को गणितीय अंक प्रणाली पर विचार करना चाहिए जिसका हम उपयोग कर रहे हैं ... इस मामले में दशमलव (आधार 10)। 23 एक दशमलव संख्या है; यह 0x1000 + 0x100 + 2x10 + 3 = 23 है। अष्टक में, यह 2X8 + 3 और इसी तरह है। इसलिए, भंडारण इंजन से कहने के लिए, "दो अग्रणी शून्य के साथ स्टोर 23" उपयोगी नहीं है, क्योंकि यह केवल उसी अंतिम परिणाम को एन्कोड करता है, जो 23 है। SQL सर्वर आपके शून्य को अनदेखा नहीं करता है, यह केवल आपके लिए एक दशमलव मान लौटाता है आपके द्वारा डाली गई संख्या के बराबर, यानी, 0023 या 23.
ooutwire
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.