MySQL - "0" के साथ पैड ज़िप कोड को कैसे सामने रखा जाए?


93

मेरे MySQL InnoDB डेटाबेस में, मेरे पास गंदा ज़िप कोड डेटा है जिसे मैं साफ करना चाहता हूं।

स्वच्छ ज़िप कोड डेटा तब होता है जब मेरे पास ज़िप कोड के लिए सभी 5 अंक होते हैं (जैसे "90210")।

लेकिन किसी कारण से, मैंने अपने डेटाबेस में देखा कि "0" से शुरू होने वाले ज़िपकोड के लिए, 0 को गिरा दिया गया है।

तो " होल्ट्सविले, न्यूयॉर्क " "ज़िपकोड" के साथ 00544मेरे डेटाबेस में " 544"

तथा

" डेधम, MA " जिपकोड के साथ " 02026" मेरे डेटाबेस में " 2026" के रूप में संग्रहीत है ।

एसक्यूएल मैं किसी भी जिपकोड को फ्रंट पैड "0" पर चला सकता हूं जो लंबाई में 5 अंक नहीं है? मतलब, अगर ज़िपकोड लंबाई में 3 अंक है, तो सामने पैड "00" है। यदि ज़िपकोड लंबाई में 4 अंक है, तो फ्रंट पैड सिर्फ "0" है।

अद्यतन :

मैंने अभी-अभी जिपकोड बदलकर डेटाटाइप (5) किया


3
ऐसा लगता है कि ज़िपकोड के लिए टेबल कॉलम नंबर का है और इस कारण समस्या हो रही है। उस स्थिति में, आपको वर्ण डेटा रखने के लिए डेटा प्रकार बदलना होगा।
कंगण

1
@ कोंकण, आप सही हैं। मेरा डेटा टाइप एक नंबर था। मैंने अभी zipcode को varchar (5) में परिवर्तित किया है। अब, "0" के साथ फ्रंटपेज <5 अंकीय ज़िपकोड कैसे जाना है?
टेडीआर

1
VARCHAR के बजाय CHAR का उपयोग करना बेहतर है। जब तालिका बड़ी हो जाती है, तो यह प्रश्नों को बहुत
तेज़ी से बढ़ाएगा

2
यह भी विचार करें कि अन्य देशों के डाक कोड हमेशा 5 वर्ण के नहीं होते हैं।
बिल करविन

जवाबों:


219

अपने zipcodes को एक संख्यात्मक प्रकार के बजाय CHAR (5) के रूप में संग्रहीत करें, या जब आप DB से लोड करते हैं, तो अपने आवेदन को इसे शून्य के साथ पैड करें। PHP का उपयोग करके इसे करने का एक तरीका sprintf():

echo sprintf("%05d", 205); // prints 00205
echo sprintf("%05d", 1492); // prints 01492

या आप MySQL पैड को अपने साथ रख सकते हैं LPAD():

SELECT LPAD(zip, 5, '0') as zipcode FROM table;

यहां सभी पंक्तियों को अपडेट और पैड करने का एक तरीका दिया गया है:

ALTER TABLE `table` CHANGE `zip` `zip` CHAR(5); #changes type
UPDATE table SET `zip`=LPAD(`zip`, 5, '0'); #pads everything

मैं वास्तव में डेटाबेस में ही अपने डेटा को साफ करना चाहूंगा। क्या आप SQL के साथ ऐसा करने के बराबर जानते हैं?
टेडीआर

1
मैंने निम्नलिखित कोड चलाया जिसने इसे "UPDATE tablename SET zip = LPAD (zip, 5, '0');"
टेडीआर

मैं यह तर्क दूंगा कि यह 'स्वीकृत' उत्तर उतना अच्छा नहीं है जितना कि ZEROFILLउत्तर।
रिक जेम्स

इस जवाब में एक दोष। यदि डिफ़ॉल्ट CHARACTER SETutf8 है, तो वह CHAR(5)अनावश्यक रूप से 15 बाइट लेगा!
रिक जेम्स

19

आपको ज़िप कोड की लंबाई तय करने की आवश्यकता है (जो मेरा मानना ​​है कि 5 वर्ण लंबा होना चाहिए)। फिर आपको संख्याओं को शून्य-भरने के लिए MySQL को बताने की आवश्यकता है।

मान लीजिए कि आपकी तालिका को बुलाया गया है mytableऔर प्रश्न में फ़ील्ड zipcodeटाइप है smallint। आपको निम्नलिखित प्रश्न जारी करने की आवश्यकता है:

ALTER TABLE mytable CHANGE `zipcode` `zipcode`
    MEDIUMINT( 5 ) UNSIGNED ZEROFILL NOT NULL;

इस पद्धति का लाभ यह है कि यह आपके डेटा को बरकरार रखता है, डेटा प्रविष्टि / अपडेट के दौरान ट्रिगर्स का उपयोग करने की कोई आवश्यकता नहीं है, डेटा का उपयोग करते समय आपको फ़ंक्शंस का उपयोग करने की कोई आवश्यकता नहीं है SELECTऔर आपको हमेशा अतिरिक्त शून्य हटा सकते हैं या फ़ील्ड की लंबाई बढ़ानी चाहिए अपना विचार बदल लो।


3
Unsigned Zerofill जाने का रास्ता है, हालांकि स्मॉलिंट 65535 पर बाहर निकलता है। मैं सुझाव दूंगा। कैली में 9xxxx के ज़िप हैं।
ब्रैंडन-एस्ट्रेला-देव

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

12

ठीक है, इसलिए आपने नंबर को VARCHAR (5) से कॉलम स्विच किया है। अब आपको बाएं-गद्देदार होने के लिए ज़िपकोड फ़ील्ड को अपडेट करना होगा। ऐसा करने के लिए SQL होगा:

UPDATE MyTable
SET ZipCode = LPAD( ZipCode, 5, '0' );

यह सभी वर्णों को पिनकोड कॉलम में 5 वर्णों तक पैड करेगा, जो बाईं ओर '0' जोड़ रहा है।

बेशक, अब जब आपने अपने सभी पुराने डेटा को ठीक कर लिया है, तो आपको यह सुनिश्चित करने की आवश्यकता है कि आपका कोई भी नया डेटा शून्य-गद्देदार हो। ऐसा करने के सही तरीके पर विचार के कई स्कूल हैं:

  • इसे एप्लिकेशन के बिजनेस लॉजिक में हैंडल करें। लाभ: डेटाबेस-स्वतंत्र समाधान, डेटाबेस के बारे में अधिक सीखना शामिल नहीं करता है। नुकसान: सभी अनुप्रयोगों में, डेटाबेस को लिखने वाले हर जगह को संभालने की आवश्यकता है।

  • एक संग्रहीत प्रक्रिया के साथ इसे संभालें। लाभ: संग्रहीत प्रक्रियाएं सभी ग्राहकों के लिए व्यावसायिक नियम लागू करती हैं। नुकसान: संग्रहीत प्रक्रियाएं सरल INSERT / UPDATE कथनों की तुलना में अधिक जटिल हैं, और पूरे डेटाबेस में पोर्टेबल नहीं हैं। एक नंगे INSERT / UPDATE अभी भी गैर-शून्य-गद्देदार डेटा सम्मिलित कर सकता है।

  • इसे ट्रिगर के साथ संभालें। लाभ: संग्रहीत प्रक्रियाओं और नंगे INSERT / अद्यतन विवरण के लिए काम करेंगे। नुकसान: कम से कम पोर्टेबल समाधान। सबसे धीमा समाधान। ट्रिगर सही होने के लिए कठिन हो सकते हैं।

इस मामले में, मैं इसे एप्लिकेशन स्तर (यदि सभी पर), और डेटाबेस स्तर पर नहीं संभालूंगा। आखिरकार, सभी देश 5-अंकीय ज़िपकोड का उपयोग नहीं करते हैं (यूएस भी नहीं - हमारे ज़िपकोड वास्तव में ज़िप + 4 + 2: nnnnn-nnnn-nn हैं) और कुछ अक्षर और साथ ही अंकों की अनुमति देते हैं। डेटा प्रारूप को आजमाने और उसे लागू करने के लिए और सामयिक डेटा त्रुटि को स्वीकार करने के लिए बेहतर नहीं है, किसी को सही मूल्य में प्रवेश करने से रोकने के लिए, भले ही यह प्रारूप वह नहीं है जिसकी आपने अपेक्षा की थी।


4

मुझे पता है कि यह ओपी के बाद ठीक है। एक तरीका जिससे आप जा सकते हैं, वह टेबल को एक असंपीड़ित INT के रूप में जिपकोड डेटा संग्रहीत करता है, लेकिन शून्य के साथ प्रदर्शित निम्नानुसार है।

select LPAD(cast(zipcode_int as char), 5, '0') as zipcode from table;

हालांकि यह मूल डेटा को INT के रूप में संरक्षित करता है और स्टोरेज में कुछ जगह बचा सकता है जो आपके पास सर्वर होगा INT को CHAR रूपांतरण के लिए। इसे एक दृश्य में फेंक दिया जा सकता है और जिस व्यक्ति को इस डेटा की आवश्यकता है उसे वहां बनाम टेबल पर ही निर्देशित किया जा सकता है।


3

यह अभी भी एक ज़िपरहित अहस्ताक्षरित पूर्णांक फ़ील्ड के रूप में आपके ज़िप कोड फ़ील्ड बनाने के लिए समझ में आएगा।

CREATE TABLE xxx ( zipcode INT(5) ZEROFILL UNSIGNED, ... )

इस तरह mysql आपके लिए पैडिंग का ख्याल रखता है।


3
CHAR(5)

या

MEDIUMINT (5) UNSIGNED ZEROFILL

पहला ज़िप कोड प्रति 5 बाइट लेता है।

दूसरा ज़िप कोड प्रति केवल 3 बाइट्स लेता है। अग्रणी शून्य वाले ज़िप कोड के लिए ZEROFILL विकल्प आवश्यक है।



0

LPAD VARCHAR2 के साथ काम करता है क्योंकि यह बाइट्स के लिए बायीं ओर रिक्त स्थान नहीं डालता है। LHS SO डेटाटाइप पर शून्य से शून्य / शून्य बाइट्स को LPAD बदलता है VARCHAR2 होना चाहिए

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