MySQL में zerofill का क्या लाभ है?


168

मैं सिर्फ यह जानना चाहता हूं कि DataType के ZEROFILLलिए परिभाषित करने का क्या लाभ / उपयोग INTहै MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 


अच्छा प्रश्न। संबंधित प्रश्न जो भी पूछे जा सकते हैं: क्या ZEROFILL का उपयोग न करने के अच्छे कारण हैं? ZEROFILL का उपयोग करने की कमियां और संभावित नुकसान क्या हैं? क्या लाभ कमियां पल्ला झाड़ते हैं?
spencer7593

स्पष्टीकरण देखें stackoverflow.com/questions/5634104/…
priyabagus

जवाबों:


254

जब आप किसी स्तंभ का चयन करते हैं, तो ZEROFILLवह उस क्षेत्र के प्रदर्शित मान को दिखाता है जिसमें स्तंभ परिभाषा में निर्दिष्ट प्रदर्शन चौड़ाई तक शून्य होता है। प्रदर्शन चौड़ाई की तुलना में लंबे समय तक मानों को छोटा नहीं किया गया है। ध्यान दें कि इसका उपयोग ZEROFILLभी निहित है UNSIGNED

ZEROFILLडेटा को कैसे संग्रहीत किया जाता है, इसका उपयोग करने और प्रदर्शन चौड़ाई का कोई प्रभाव नहीं पड़ता है। यह केवल यह प्रदर्शित करता है कि यह कैसे प्रभावित करता है।

यहाँ कुछ उदाहरण एसक्यूएल है जो ZEROFILLनिम्न का उपयोग प्रदर्शित करता है :

CREATE TABLE yourtable (x INT(8) ZEROFILL NOT NULL, y INT(8) NOT NULL);
INSERT INTO yourtable (x,y) VALUES
(1, 1),
(12, 12),
(123, 123),
(123456789, 123456789);
SELECT x, y FROM yourtable;

परिणाम:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789

52
@diEcho: यदि उदाहरण के लिए आप चाहते हैं कि आपके सभी चालान नंबर 10 अंकों के साथ प्रदर्शित हों तो आप उस कॉलम के प्रकार को INT (10) ZEROFILL घोषित कर सकते हैं।
मार्क बायर्स

76
मैं आपको इस सुविधा से दूर रहने की अत्यधिक सलाह देता हूं - एक संख्यात्मक मान कैसे प्रदर्शित / स्वरूपित किया जाता है एक प्रस्तुति चिंता का विषय है, और बिल्कुल ऐसा नहीं है जो डेटाबेस-स्तर पर है; कम से कम नहीं अगर आप डेटाबेस का उपयोग कर रहे हैं सॉफ्टवेयर का एक टुकड़ा वापस करने के लिए। ध्यान रखें कि यह समस्याएं पैदा कर सकता है - यदि आप एक पूर्णांक के रूप में एक प्रमुख शून्य के साथ एक मान को पार्स करते हैं, तो कई पार्सर्स ऑक्टल के रूप में मूल्य का सम्मान करेंगे, जो कि शायद आप क्या चाहते हैं। इस सुविधा का उपयोग करने का एकमात्र समय, स्टोरेज (संग्रहण) ऑप्टिमाइज़ेशन के रूप में होता है, जब आप जो वास्तव में स्टोर कर रहे होते हैं, वह अंकों का प्रभावी (निश्चित-लंबाई) स्ट्रिंग होता है।
mindplay.dk 17

3
@ mindplay.dk: निर्भर करता है। यदि आप GTIN की तरह कुछ स्टोर कर रहे हैं, तो उन्हें 14 अंक लंबे होने चाहिए, लेकिन शून्य से सिर्फ 8 अंक और बाएं-पैडेड भी हो सकते हैं। आउटपुट पक्ष पर निर्भर रहना इस मामले में सही नहीं होगा, क्योंकि यह केवल एक दशमलव नहीं है, बल्कि एक कुंजी है।
दानमेन

1
@MarkByers, व्यावहारिक रूप से बोल रहा है, ज्यादातर क्लाइंट-लाइब्रेरियों (जैसे PHP) को केवल जीरो से नहीं उतारेंगे, इससे पहले कि वे इसे एप्लिकेशन कोड को सौंप दें? यदि हां, तो यह वास्तव में कुछ हद तक व्यर्थ लगता है। MySQL के शुरुआती दिनों में एक खराब डिज़ाइन।
पचेरियर

131

समझने के लिए एक उदाहरण, जहाँ उपयोग ZEROFILLदिलचस्प हो सकता है:

जर्मनी में, हमारे पास 5 अंकों के ज़िपकोड हैं। हालाँकि, वे कोड एक शून्य के साथ शुरू हो सकते हैं, इसलिए 80337मुनिक के लिए एक वैध ज़िपकोड है, 01067बर्लिन का एक ज़िपकोड है।

जैसा कि आप देखते हैं, किसी भी जर्मन नागरिक को उम्मीद है कि ज़िपकोड को 5 अंकों के कोड के रूप में प्रदर्शित किया जाएगा, इसलिए 1067यह अजीब लगता है।

उन डेटा को संग्रहीत करने के लिए, आप एक VARCHAR(5)या फिर उपयोग कर सकते हैं INT(5) ZEROFILLजबकि zerofilled पूर्णांक के दो बड़े फायदे हैं:

  1. हार्ड डिस्क पर कम संग्रहण स्थान
  2. यदि आप सम्मिलित करते हैं 1067, तो आप अभी भी 01067वापस आते हैं

शायद इस उदाहरण के उपयोग को समझने में मदद करता है ZEROFILL


10
यह जोड़ने योग्य है कि डेटा प्रदर्शित करने वाले SQL क्लाइंट अग्रणी शून्य के साथ संख्याओं को प्रारूपित करने के लिए जिम्मेदार है। यह कुछ ऐसा नहीं है जो "आटोमैटिकली" प्रत्येक और हर एप्लिकेशन के डेटा के साथ होता है।
a_horse_with_no_name

निश्चित चौड़ाई के कॉलम भी बेहतर हैं, क्योंकि वे डिस्क-डिस्क विखंडन को कम करते हैं।
दानमेन

@Phil, व्यावहारिक रूप से बोल रहा है, ज्यादातर क्लाइंट-लाइब्रेरियों (जैसे PHP) से पहले जीरो को स्ट्रिप करने से पहले वे इसे एप्लीकेशन कोड को नहीं सौंपेंगे? यदि हां, तो यह वास्तव में कुछ हद तक व्यर्थ लगता है। MySQL के शुरुआती दिनों में एक खराब डिज़ाइन।
पचेरियर

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

61

यह परेशान व्यक्तित्वों के लिए एक विशेषता है जो वर्ग बक्से पसंद करते हैं।

आप डालें

1
23
123 

लेकिन जब आप चयन करते हैं, तो यह मानों को पैड करता है

000001
000023
000123

15

यह मामला है कि आप की आवश्यकता होगी में सही छंटाई करने में मदद करता श्रेणीबद्ध कुछ और (एक और नंबर या पाठ) एक "पाठ" तो के रूप में हल हो की आवश्यकता होगी जो के साथ इस "पूर्णांक"।

उदाहरण के लिए,

यदि आप पूर्णांक क्षेत्र नंबरों का उपयोग करने की आवश्यकता होगी (मान लीजिए कि 5 है) concatenated के रूप में एक 005 या 10/0005


4

मुझे पता है कि मुझे पार्टी में देर हो रही है लेकिन मुझे लगता है कि ज़ीरोफिल टिनिट (1) के बूलियन प्रतिनिधित्व के लिए सहायक है। नल का मतलब हमेशा गलत नहीं होता है, कभी-कभी आप इसे नहीं चाहते हैं। एक छोटे से झटके से, आप प्रभावी रूप से उन मूल्यों को INT में परिवर्तित कर रहे हैं और किसी भी भ्रम की स्थिति को दूर कर सकते हैं। आपका एप्लिकेशन फिर उन मानों को प्राथमिक डेटाटाइप के समान व्यवहार कर सकता है True = Not (0)


1
धन्यवाद, लेकिन दुर्भाग्य से मैंने सिर्फ एक mysql db के खिलाफ कुछ परीक्षण चलाए और यह शून्य मान शून्य करता है: - / /। इस लक्ष्य को अभी भी शून्य की अनुमति नहीं देने के लिए क्षेत्र को विवश करके पूरा किया गया है। मुझे कोशिश करनी चाहिए कि मैं dbs के बारे में सवालों के जवाब देने की कोशिश करूं और न ही आमतौर पर उपयोग करूं। इससे पहले कि लोग बहुत खुश हों, मेरा जवाब हटा दें। योग्य
मार्लिन

1
उपयोगी? यह गलत है। Zerofill कुछ नहीं करता है (बिना जोड़ के) जब प्रदर्शन की लंबाई 1. होती है
Brilliand

@ मर्लिन और आपको हमेशा सही या गलत के लिए एक डिफ़ॉल्ट मान सेट करना चाहिए ... यदि आप डिफ़ॉल्ट मानों का उपयोग नहीं करते हैं, तो आपके द्वारा बताई गई समस्या केवल एक ही नहीं है ... नॉट NULL होना चाहिए और साथ ही :)
बकरीवद

मैं नीचा दिखाऊंगा, लेकिन आपका रेप इस तरह है 666कि मैं इस जवाब को रखना चाहूंगा;-)
मार्टिन

3
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)

1

जब वैकल्पिक (गैर-मानक) विशेषता ZEROFILL के साथ संयोजन में उपयोग किया जाता है, तो रिक्त स्थान की पैडिंग को शून्य से बदल दिया जाता है। उदाहरण के लिए, INT (4) ZEROFILL के रूप में घोषित कॉलम के लिए, 5 का मान 0005 के रूप में लिया गया है।

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html


लिंक इसके बजाय dev.mysql.com/doc/refman/5.0/en/numeric-type-attributes.html होगा
arhak

1

यदि आप एक संख्यात्मक स्तंभ के लिए शून्य निर्दिष्ट करते हैं, तो MySQL स्वचालित रूप से स्तंभ के लिए UNSIGNED विशेषता जोड़ता है।

संख्यात्मक डेटा प्रकार जो UNSIGNED विशेषता की अनुमति देते हैं, वे भी SIGNED की अनुमति देते हैं। हालाँकि, इन डेटा प्रकारों पर डिफ़ॉल्ट रूप से हस्ताक्षर किए जाते हैं, इसलिए SIGNED विशेषता का कोई प्रभाव नहीं पड़ता है।

उपरोक्त विवरण MYSQL की आधिकारिक वेबसाइट से लिया गया है।


0

खाली करना

इसका अनिवार्य रूप से अर्थ है कि यदि पूर्णांक मान 23 को 8 की चौड़ाई के साथ एक INT कॉलम में डाला जाता है, तो उपलब्ध स्थिति के बाकी हिस्से स्वचालित रूप से शून्य के साथ गद्देदार हो जाएंगे।

अत

23

हो जाता है:

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