মাইএসকিউএল - "0" সহ প্যাড জিপ কোডটি কীভাবে করবেন?


93

আমার মাইএসকিউএল ইনোডিবি ডাটাবেসে আমার কাছে নোংরা জিপ কোড ডেটা রয়েছে যা আমি পরিষ্কার করতে চাই।

পরিষ্কার জিপ কোড ডেটা হ'ল যখন আমার কাছে একটি জিপ কোডের জন্য সমস্ত 5 অঙ্ক থাকে (যেমন "90210")।

তবে কিছু কারণে, আমি আমার ডাটাবেসে লক্ষ্য করেছি যে "0" দিয়ে শুরু হওয়া জিপকোডগুলির জন্য, 0 বাদ দেওয়া হয়েছে।

সুতরাং " হলটসভিলে, নিউইয়র্ক " "জিপকোড সহ" 00544"আমার ডাটাবেসে" 544" হিসাবে সংরক্ষণ করা আছে

এবং

" ডেডহাম, এমএ " জিপকোড সহ " 02026" আমার ডাটাবেসে " 2026" হিসাবে সংরক্ষণ করা আছে ।

দৈর্ঘ্যে 5 ডিজিট নয় এমন কোনও জিপকোডের সামনের প্যাড "0" এ আমি কী এসকিউএল চালাতে পারি? অর্থ, জিপকোডের দৈর্ঘ্যে 3 অঙ্ক থাকলে সামনের প্যাড "00"। যদি জিপকোড দৈর্ঘ্যে 4 ডিজিট হয় তবে সামনের প্যাড কেবল "0"।

আপডেট :

আমি সবেমাত্র জিপকোডকে ডেটাটাইপ ভর্চার (5) হিসাবে পরিবর্তন করেছি


4
দেখে মনে হচ্ছে জিপকোডের টেবিল কলামটি সংখ্যা টাইপের এবং এটি সমস্যা তৈরি করছে। সেক্ষেত্রে অক্ষরের ডেটা রাখতে আপনাকে ডেটা টাইপ পরিবর্তন করতে হবে।
কাঙকান

4
কংকান, আপনি ঠিক বলেছেন আমার তথ্য টাইপ একটি নম্বর ছিল। আমি সবেমাত্র জিপকোডটিকে ভারচারে রূপান্তরিত করেছি (5) এখন, কীভাবে "0" দিয়ে প্রথম পৃষ্ঠার <5 ডিজিটের জিপকডগুলি যাবেন?
টেডিআর

4
ভর্চারের পরিবর্তে CHAR ব্যবহার করা ভাল। টেবিলটি বড় হয়ে
উঠলে এটি অনেকাংশে

4
এছাড়াও বিবেচনা করুন অন্যান্য দেশের পোস্ট কোডগুলি সর্বদা 5 টি অক্ষর নয়।
বিল কারভিন

উত্তর:


221

সংখ্যার ধরণের পরিবর্তে আপনার জিপকোডগুলি CHAR (5) হিসাবে সংরক্ষণ করুন, বা আপনি যখন ডিবি থেকে লোড করবেন তখন আপনার অ্যাপ্লিকেশনটি জিরো দিয়ে প্যাড করুন। পিএইচপি ব্যবহার করে এটি করার একটি উপায় sprintf():

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

অথবা আপনার সাথে এটির জন্য মাইএসকিউএল প্যাড থাকতে পারে 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

আমি ডাটাবেসে নিজেই আমার ডেটা পরিষ্কার করতে চাই। আপনি কি এসকিউএল দিয়ে এটি করার সমতুল্য জানেন?
টেডিআর

4
আমি নিম্নলিখিত কোডটি চালিয়েছি যা এটিকে "আপডেটের টেবিলের নাম SET zip = LPAD (জিপ, 5, '0') করে তোলে;"
টেডিআর

আমি যুক্তি দিয়ে বলব যে এই 'গৃহীত' ZEROFILLউত্তরগুলি উত্তরের মতো ভাল নয় ।
রিক জেমস

এই উত্তরের একটি ত্রুটি। যদি ডিফল্টটি CHARACTER SETutf8 হয় তবে CHAR(5)তা অযথা 15 বাইট নেবে!
রিক জেমস

19

আপনাকে জিপ কোডটির দৈর্ঘ্য নির্ধারণ করতে হবে (যা আমি বিশ্বাস করি যে এটি 5 টি অক্ষরের দীর্ঘ হওয়া উচিত)। তারপরে আপনাকে মাইএসকিউএলকে সংখ্যাগুলি শূন্য-পূরণ করতে বলা উচিত।

ধরা যাক আপনার টেবিলটি ডাকা হয়েছে mytableএবং প্রশ্নে ক্ষেত্রটি zipcodeটাইপ করুন smallint। আপনাকে নিম্নলিখিত কোয়েরি ইস্যু করতে হবে:

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

এই পদ্ধতির সুবিধাটি হ'ল এটি আপনার ডেটা অক্ষুণ্ন রেখে দেয়, ডেটা সন্নিবেশ / আপডেটের সময় ট্রিগারগুলি ব্যবহার করার দরকার নেই, যখন আপনি SELECTডেটা দেবেন তখন ফাংশনগুলি ব্যবহার করার দরকার নেই এবং আপনি সর্বদা অতিরিক্ত শূন্যগুলি সরাতে বা ক্ষেত্রের দৈর্ঘ্য বাড়িয়ে তুলতে পারেন আপনি মত পরিবর্তন করেছেন.


4
স্বাক্ষরবিহীন জিরোফিল যাওয়ার উপায়, যদিও ক্ষুদ্রাকৃতিটি 65535 এ সর্বাধিক আউট। কালীতে 9XXXX এর জিপ রয়েছে।
ব্র্যান্ডন-এস্ট্রেলা-দেব

4
আপনি যদি অন্য দেশের জন্য পোস্টাল কোডগুলি সমর্থন করতে চান তবে আপনি পূর্ণসংখ্যা চান না। কিছু দেশ তাদের পোস্টাল কোডগুলিতে চিঠি ব্যবহার করে।
Wodin

12

ঠিক আছে, সুতরাং আপনি কলামটি সংখ্যা থেকে VARCHAR (5) এ স্যুইচ করেছেন। বাম-প্যাড করার জন্য এখন আপনাকে জিপকোড ক্ষেত্রটি আপডেট করতে হবে। এটি করার জন্য এসকিউএল হ'ল:

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

এটি জিপকোড কলামের সমস্ত মানকে 5 টি অক্ষরে প্যাড করবে, বামদিকে '0 টি যোগ করবে।

অবশ্যই, এখন আপনি নিজের সমস্ত পুরানো ডেটা ঠিক করে ফেলেছেন, আপনার কোনও নতুন ডেটাও শূন্য-প্যাডড রয়েছে তা নিশ্চিত করা দরকার। এটি করার সঠিক উপায়ে বেশ কয়েকটি বিদ্যালয় রয়েছে:

  • অ্যাপ্লিকেশনটির ব্যবসায়িক যুক্তিতে এটি পরিচালনা করুন। সুবিধা: ডাটাবেস-স্বাধীন সমাধান, ডাটাবেস সম্পর্কে আরও শেখার জড়িত না। অসুবিধাগুলি: সমস্ত অ্যাপ্লিকেশনটিতে ডেটাবেজে লেখার জন্য সর্বত্র পরিচালনা করা দরকার।

  • এটি একটি সঞ্চিত পদ্ধতি সহ পরিচালনা করুন। সুবিধাগুলি: সঞ্চিত পদ্ধতিগুলি সমস্ত ক্লায়েন্টের ব্যবসায়ের নিয়ম প্রয়োগ করে। অসুবিধাগুলি: সঞ্চিত পদ্ধতিগুলি সহজ INSERT / আপডেটের বিবৃতিগুলির চেয়ে জটিল এবং ডেটাবেসগুলিতে বহনযোগ্য হিসাবে নয়। একটি খালি INSERT / UPDATE এখনও শূন্য-প্যাডযুক্ত ডেটা .োকাতে পারে।

  • একটি ট্রিগার দিয়ে এটি পরিচালনা করুন। সুবিধা: সঞ্চিত পদ্ধতি এবং খালি INSERT / আপডেটের বিবৃতিতে কাজ করবে Will অসুবিধাগুলি: স্বল্প পোর্টেবল সমাধান। সবচেয়ে ধীরে সমাধান। ট্রিগারগুলি সঠিকভাবে পাওয়া শক্ত হতে পারে।

এই ক্ষেত্রে, আমি এটিকে অ্যাপ্লিকেশন স্তরে (যদি আদৌ) হ্যান্ডেল করব, এবং ডাটাবেস স্তরে নয়। সর্বোপরি, সমস্ত দেশ 5-সংখ্যার জিপকোড ব্যবহার করে না (এমনকি মার্কিন যুক্তরাষ্ট্রও নয় - আমাদের জিপকোডগুলি আসলে জিপ + 4 + 2: এনএনএনএন-এনএনএনএন-এনএন) এবং কিছু অক্ষর পাশাপাশি অঙ্কেরও অনুমতি দেয়। কোনও ডেটা ফর্ম্যাট চেষ্টা ও জোর করা না হওয়া এবং কাউকে সঠিক মান প্রবেশ করতে বাধা দেওয়ার চেয়ে মাঝে মাঝে ডেটা ত্রুটি গ্রহণ করা ভাল, যদিও এটি ফর্ম্যাটটি আপনি প্রত্যাশা করেছিলেন ঠিক তেমনটি নয়।


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, ... )

এইভাবে মাইএসকিএল আপনার জন্য প্যাডিংয়ের যত্ন নেয়।


3
CHAR(5)

বা

MEDIUMINT (5) UNSIGNED ZEROFILL

প্রথমটিতে জিপ কোডে 5 বাইট লাগে।

দ্বিতীয়টিতে পিন কোডে মাত্র 3 বাইট লাগে। শীর্ষস্থানীয় জিরো সহ জিপ কোডগুলির জন্য জেরোফিল বিকল্পটি প্রয়োজনীয়।



0

এলপ্যাড ভিআচআরএআর 2 নিয়ে কাজ করে কারণ এটি বাম ওভার বাইটের জন্য স্পেস রাখে না। এলপ্যাড লেফটওয়ার / নাল বাইটগুলিকে এলএইচএস এর ডায়াটাইপগুলিতে শূন্যে পরিবর্তন করে VARCHAR2 হওয়া উচিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.