এসকিউএল-এ ভ্যাচার-এর চেয়ে CHAR নির্বাচন করার জন্য ব্যবহারের ক্ষেত্রে কী কী?


270

আমি বুঝতে পারি যে আমার সমস্ত মানগুলি নির্দিষ্ট-প্রস্থের হলে CHAR প্রস্তাবিত। কিন্তু, তাহলে কী? শুধু নিরাপদ থাকার জন্য কেন কেবল সমস্ত পাঠ্য ক্ষেত্রের জন্য ভ্রচারকে বাছাই করা উচিত নয়।

উত্তর:


386

সমস্ত সারি একই দৈর্ঘ্যের কাছাকাছি থাকলে সাধারণত CHAR বাছুন । যখন দৈর্ঘ্য পরিবর্তিত হয় তখন VARCHAR বাছুন উল্লেখযোগ্যভাবে । CHAR এছাড়াও কিছুটা দ্রুত হতে পারে কারণ সমস্ত সারি একই দৈর্ঘ্যের।

এটি ডিবি বাস্তবায়নের দ্বারা পরিবর্তিত হয়, তবে সাধারণত ভোচারআর আসল ডেটা ছাড়াও স্টোরের আরও একটি বা দুটি বাইট ব্যবহার করে (দৈর্ঘ্য বা সমাপ্তির জন্য)। সুতরাং (ধরে নিই যে আপনি একটি বাইট অক্ষর সেট ব্যবহার করছেন) শব্দটি "ফুবার" সংরক্ষণ করে

  • চার (6) = 6 বাইট (কোনও ওভারহেড নেই)
  • ভর্চার (10) = 8 বাইট (ওভারহেডের 2 বাইট)
  • চর (10) = 10 বাইট (ওভারহেডের 4 বাইট)

তুলনামূলকভাবে একই দৈর্ঘ্যের ডেটা (দুটি অক্ষরের দৈর্ঘ্যের পার্থক্যের মধ্যে) এর জন্য নীচের লাইনটি CHAR দ্রুত এবং বেশি স্থান দক্ষ হতে পারে ।

দ্রষ্টব্য : মাইক্রোসফ্ট এসকিউএল এর একটি ভিআরচআরএর জন্য 2 বাইট ওভারহেড রয়েছে। এটি ডিবি থেকে ডিবি-তে পরিবর্তিত হতে পারে, তবে সাধারণত একটি VARCHAR এর দৈর্ঘ্য বা EOL নির্দেশ করার জন্য ওভারহেডের কমপক্ষে 1 বাইট প্রয়োজন।

মন্তব্যে গ্যাভেন দ্বারা চিহ্নিত করা হয়েছে, আপনি যদি ইউটিএফ 8 এর মতো একটি বহু-বাইট, পরিবর্তনশীল দৈর্ঘ্যের অক্ষর ব্যবহার করে থাকেন তবে CHAR অক্ষরের সংখ্যা সংরক্ষণের জন্য প্রয়োজনীয় সর্বাধিক সংখ্যক বাইট সংরক্ষণ করে। সুতরাং কোনও অক্ষর সংরক্ষণের জন্য যদি ইউটিএফ 8-এর সর্বোচ্চ 3 বাইটের প্রয়োজন হয় তবে কেবল ল্যাটিন 1 অক্ষর সংরক্ষণ করলেও CHAR (6) 18 বাইটে স্থির করা হবে। সুতরাং এক্ষেত্রে ভর্চার অনেক ভাল পছন্দ হয়ে ওঠে।


20
আরেকটি কারণ হ'ল পৃষ্ঠা বিভাজন এবং খণ্ড খণ্ডন। আমার একটি আইডিএন পিকে সাথে একটি টেবিল ছিল যা ভ্যাচার কলামগুলিতে পৃষ্ঠা বিভাজনের কারণে 99% খণ্ডিত হয়েছিল। একটি খুব সক্রিয় টেবিল এবং অ্যাপ্লিকেশন প্রকৃতির দ্বারা একটি নতুন সারি খালি সারি তৈরি হবে এবং তারপরে পপুলেশন হবে। চর বিভাজন সমস্যা স্থির করে।
পাপারাজ্জো

12
@ জিম ম্যাককিথ - এই গণনাগুলি কেবল সত্য যদি আপনি লাতিন 1 অক্ষর ব্যবহার করছেন। যেহেতু বেশিরভাগ লোককে এই দিনগুলিতে utf8 ব্যবহার করা উচিত, তাই আপনার CHAR কলামগুলি ভিত্তিক বহুভাষিক সমতলটিতে বেশিরভাগ অক্ষর সংরক্ষণ করে রাখা ভিচারার হিসাবে গড়ে 3x স্পেস ব্যবহার করতে চলেছে।
গাভিন তোয়ি

11
@ জিমএমসিকিথ হ্যাঁ, এটি ঠিক সঠিক। যেহেতু CHAR দৈর্ঘ্য নির্ধারিত, তাই এটি ব্যবহার করা যেতে পারে এমন সর্বোচ্চ সম্ভাব্য স্থানে স্থির করতে হবে। ইউটিএফ 8-তে এটি চরিত্র অনুসারে 3 বাইট। বারচারের জন্য, প্রয়োজন অনুযায়ী অক্ষর প্রতি 1-3 বাইট ব্যবহার করা বিনামূল্যে। এটি মাইএসকিউএল ম্যানুয়ালটিতে রয়েছে: dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html
গাভিন

3
FooBar এবং varchar (100) বনাম চর (100) এর সাথে পার্থক্য কী? আমি ভাবছি যে পার্থক্যটি আরও ভাল করে দেখায়, হ্যাঁ? কোন?
Nenotlep

4
@ গ্যাভিনটওয়ে এসকিউএলএসভার তার এনসিএইচআর এবং এনভিচারার ডেটাটাইপগুলির জন্য ইউসিএস -২ ব্যবহার করে। এটি সর্বদা চরিত্র অনুসারে দুটি বাইট।
1010

69

আপনি যদি আমার সাথে কাজ করছেন এবং আপনি ওরাকল এর সাথে কাজ করছেন, আমি সম্ভবত আপনাকে varcharপ্রায় প্রতিটি পরিস্থিতিতে ব্যবহার করতে চাই । ধারণাটি যা সত্যের charচেয়ে কম প্রক্রিয়াকরণ শক্তি ব্যবহার করে varchar... এটি এখন ... তবে ডাটাবেস ইঞ্জিনগুলি সময়ের সাথে সাথে আরও ভাল হয় এবং এই ধরণের সাধারণ নিয়মে ভবিষ্যতের "মিথ" তৈরি করা হয়।

আরেকটি জিনিস: আমি কোনও পারফরম্যান্সের সমস্যা দেখিনি কারণ কেউ সাথে যাওয়ার সিদ্ধান্ত নিয়েছে varchar। আপনি আপনার সময় ভাল কোড (ডাটাবেসে কম কল) এবং দক্ষ এসকিউএল (সূচকগুলি কীভাবে কাজ করে, অপ্টিমাইজার কীভাবে সিদ্ধান্ত নেয়, কেন তার existsচেয়ে দ্রুত হয় ) রচনার জন্য আপনার সময়ের আরও ভাল ব্যবহার করবেin ...) ।

চূড়ান্ত চিন্তা: ব্যবহারের ক্ষেত্রে আমি সব ধরণের সমস্যা দেখেছি CHAR , লোকেরা '' যখন তাদের সন্ধান করা উচিত '' বা 'লোকেরা' এফইও 'খুঁজছেন তখন তারা' এফইও (এখানে স্থানের গুচ্ছ) 'খুঁজছেন should , বা লোকে ট্র্যাকিং ফাঁকাগুলি ছাঁটাচ্ছে না, বা পাওয়ারবিল্ডার সহ বাগগুলি 2000 এর মধ্যে ফাঁকা পরিমাণ যুক্ত করার সাথে এটি ওরাকল পদ্ধতি থেকে প্রত্যাবর্তিত মান।


20
আমি আপনার প্রথম অনুচ্ছেদের সাথে কিছুটা দ্বিমত পোষণ করছি, যেহেতু চরটি এমন একটি ইঙ্গিত সরবরাহ করতে পারে যা অপ্টিমাইজার, এমনকি ভবিষ্যতের ক্ষেত্রেও কার্যকর হতে পারে এবং এটি কলামের অভিপ্রায়টি যোগাযোগ করতে সহায়তা করতে পারে। তবে আপনার তৃতীয় অনুচ্ছেদের জন্য +1। আমি অতিরিক্ত সমস্ত স্থান ঘৃণা করি। কোনও ক্ষেত্রের মধ্যে আমি সমস্ত যাবতীয় [বর্ণনামূলক] প্যাডিং ছাড়াই কেবল যা কিছু রেখেছি তা সংরক্ষণ করা উচিত। মূলত, আমি কেবল চর ব্যবহার করি যদি সমস্ত ডেটা হুবহু একই দৈর্ঘ্যের হতে হয়, এখন এবং চিরকালের জন্য আর কম না হয়। এটি অবশ্যই খুব বিরল, এবং সাধারণত একটি চর (1)।
জেফ্রি এল হুইলেটজ

চর বিশ্লেষক এবং বিকাশকারীদের জন্য একটি ইঙ্গিতও সরবরাহ করে ... এই জিনিসটি অক্ষরের x সংখ্যা .... তারা যদি এটি অন্য কোনও ফর্ম্যাটে সিরিয়াল করার কথা ভাবছেন তবে এটি সহায়ক হতে পারে। (আমাকে এমএসকিএল তে একটি এমডি 5 চেকসাম সংরক্ষণ করতে বাধ্য করা হয়েছিল যার একটি ইউইড টাইপ ছিল না ... এবং আমি কখনও কিছু চাইনি << 32 বাইট ... এছাড়াও কলামে একটি সীমাবদ্ধতা রেখেছি)।
joefromct

31

পারফরম্যান্স সুবিধার পাশাপাশি, CHARসমস্ত মান একই দৈর্ঘ্য হওয়া উচিত , উদাহরণস্বরূপ, মার্কিন যুক্তরাষ্ট্রের সংক্ষিপ্তসারগুলির জন্য একটি কলাম।


বা দেশের কোডগুলি - 2 বা 3 বর্ণের দেশ কোড সংক্ষেপণের ব্যবহারের মধ্যে পার্থক্য করতে সহায়তা করতে পারে
ড্যান ফিল্ড

যদি এটি সত্যিই একটি নির্দিষ্ট দৈর্ঘ্য হয়, তবে এটি কার্যকর করার ক্ষেত্রে একটি সীমাবদ্ধতা থাকা উচিত। আপনি যদি ব্যবহার করেন তবে CHARআপনার সীমাবদ্ধতার জন্য প্যাডিংয়ের বিষয়টি নিশ্চিত করতে হবে।
jpmc26

18

চরটি খানিকটা দ্রুত গতিযুক্ত, সুতরাং আপনার যদি জানা একটি কলাম একটি নির্দিষ্ট দৈর্ঘ্য হবে তবে চরটি ব্যবহার করুন। উদাহরণস্বরূপ, লিঙ্গের জন্য অজানা (এম) আলে / (এফ) ইমেল / (ইউ) বা মার্কিন যুক্তরাষ্ট্রের জন্য 2 টি অক্ষর সংরক্ষণ করা।


4
নিশ্চিত নয় যে এটি একটি দুর্দান্ত উত্তর, যেহেতু একটি ENUM সাধারণত আরও অনেক কিছু বোঝাতে পারে, যদিও আমি নিশ্চিত নই যে এই প্রকারটি (মাইএসকিউএল এর বাইরে) কতটা সমর্থিত।
ববি জ্যাক 18

আমার কাছে মনে হয় যে রাজ্যগুলির সেট অগত্যা অপরিবর্তনীয় নয়, তাই চরের (2) এনামের চেয়ে অনেক বেশি উপযুক্ত বলে মনে হয়।
কেয়ার্নস

1
@ ববি জ্যাক - আমি কোনও বিশেষ এসকিউএল এনাম বাস্তবায়ন সম্পর্কিত সুনির্দিষ্ট বিবরণ জানি না, তবে মনে রাখবেন যে একটি 4 বাইট পূর্ণসংখ্যা হিসাবে সঞ্চিত এনামের সাথে চরের (1) বা চর (2) কলামের চেয়ে বেশি স্থানের প্রয়োজন হতে পারে একই তথ্য। এমন একটি ধারণা রয়েছে যার মধ্যে এনামগুলি তাদের ব্যাখ্যার দিক থেকে আরও যুক্তিযুক্ত, এবং এটি বাধ্যতামূলক হতে পারে তবে আরডিবিএমএস সিস্টেমের সমস্ত কিছু একটি স্তরে বিমূর্ত এবং টেবিলগুলির জন্য নির্ধারিত পূর্বাভাসের সাপেক্ষে।
জেফ্রি এল হুইলেটজ

4
খারাপ উদাহরণ, ENUM সেই ক্ষেত্রে সেরা। এর চেয়ে আরও ভাল উদাহরণ হ'ল একটি 3 অক্ষরের আইএটিএ বিমানবন্দর কোড
অ্যান্ড্রু জি জনসন

5
@ অ্যান্ড্রু, সমস্ত ডিবি সমর্থন ENUM ডেটা প্রকার নয়। এমএসএসকিউএল সার্ভার উদাহরণস্বরূপ, এটি করে না। এছাড়াও, একটি ENUM, একটি int হিসাবে সঞ্চিত, 4 বাইট নেয় CHAR (1) 1 বাইট নেয়, এবং NCHAR (1) 2 বাইট নেয়
জারেট মায়ার

17

NChar বা চর তাদের বিভিন্ন বিকল্পের চেয়ে আরও ভাল পারফর্ম করে?

দুর্দান্ত প্রশ্ন। এর সহজ উত্তর হ'ল নির্দিষ্ট পরিস্থিতিতে। আসুন দেখে নেওয়া যাক এটি ব্যাখ্যা করা যায় কিনা।

স্পষ্টতই আমরা সকলেই জানি যে আমি যদি বর্ণের একটি কলাম (255) দিয়ে একটি টেবিল তৈরি করি (আসুন এই কলামটি আমার কলামটি বলি) এবং এক মিলিয়ন সারি সন্নিবেশ করি তবে প্রতিটি সারিটির জন্য আমার কলামে কেবল কয়েকটি অক্ষর রাখি, সারণীটি অনেক ছোট হবে (সামগ্রিকভাবে স্টোরেজ ইঞ্জিনের দ্বারা প্রয়োজনীয় ডেটা পৃষ্ঠাগুলির সংখ্যা) যদি আমি আমার কলামটি চর হিসাবে তৈরি করেছি (255)। যে কোনও সময় আমি সেই টেবিলটিতে কোনও অপারেশন (ডিএমএল) করি এবং সারিগুলির প্রচুর অনুরোধ করি, আমার কলামটি ভারচার হয়ে গেলে এটি আরও দ্রুত হবে কারণ আমাকে স্থানান্তরিত করতে হবে না সমস্ত "অতিরিক্ত" স্পেস শেষে প্রায়। সরান, যেমন এসকিউএল সার্ভার অভ্যন্তরীণ প্রকার যেমন কোনও স্বতন্ত্র বা ইউনিয়ন পরিচালনা চলাকালীন, বা যদি এটি কোয়েরি পরিকল্পনার সময় কোনও মার্জ চয়ন করে, ইত্যাদি Move

তবে ভারচার ব্যবহার করার ক্ষেত্রে কিছু ওভারহেড রয়েছে। এসকিউএল সার্ভারকে প্রতিটি সারিটিতে একটি দুটি বাইট সূচক (ওভারহেড) ব্যবহার করতে হবে, সেই নির্দিষ্ট সারিটির মাইক্রোমনে এতে কতগুলি বাইট রয়েছে তা জানতে। এটি অতিরিক্ত 2 বাইট যা সমস্যাটি উপস্থাপন করে তা নয়, এটি প্রতিটি সারিতে মাই কলামে ডেটার দৈর্ঘ্য "ডিকোড" করে।

আমার অভিজ্ঞতাগুলিতে প্রশ্নের মধ্যে যোগ দেওয়া হবে এমন কলামগুলিতে বর্ণের পরিবর্তে চর ব্যবহার করা সর্বাধিক উপলব্ধি করে। উদাহরণস্বরূপ কোনও টেবিলের প্রাথমিক কী বা অন্য কিছু কলাম যা সূচিযুক্ত হবে। একটি ডেমোগ্রাফিক টেবিলের গ্রাহকনম্বার, বা একটি ডিকোড টেবিলের কোডআইডি, বা অর্ডার টেবিলের উপর অর্ডার নাম্বার। চর ব্যবহার করে, ক্যোয়ারী ইঞ্জিনটি আরও দ্রুত সংযুক্তি সম্পাদন করতে পারে কারণ এটি পৃষ্ঠাগুলি পড়ার সাথে সাথে এটি পয়েন্টারগুলিকে পরিবর্তিত পরিমাণে বাইটের স্থানান্তরিত না করে সরল পয়েন্টার গাণিতিক (নির্ধারকভাবে) করতে পারে। আমি জানি আমি আপনাকে এই শেষ বাক্যে হারিয়ে ফেলতে পারি। এসকিউএল সার্ভারে যোগ দেয় "পূর্বাভাস" ধারণার আশেপাশে। একটি শিকারী হ'ল শর্ত। উদাহরণস্বরূপ, আমার কলাম = 1, বা অর্ডার নাম্বার <500।

সুতরাং যদি এসকিউএল সার্ভার একটি ডিএমএল স্টেটমেন্ট সম্পাদন করে, এবং পূর্বাভাসগুলি বা "কীগুলি" যোগদানের একটি নির্দিষ্ট দৈর্ঘ্য (চর) হয় তবে কোয়েরি ইঞ্জিনটি এক টেবিল থেকে সারি পর্যন্ত সারি মেলে যতটা কাজ করতে পারে না doesn't অন্য টেবিল এটির সন্ধানে কতক্ষণ তথ্য রয়েছে তা খুঁজে বের করতে হবে না এবং এরপরে সন্ধানের জন্য স্ট্রিংয়ের নিচে চলে। যে সময় লাগে।

এখন মনে রাখবেন এটি সহজেই খারাপভাবে প্রয়োগ করা যেতে পারে। আমি অনলাইন সিস্টেমে প্রাথমিক কী ক্ষেত্রগুলির জন্য গৃহীত চরটি দেখেছি। প্রস্থটি অবশ্যই ছোট রাখতে হবে (চর) (15) বা যুক্তিসঙ্গত কিছু। এবং এটি অনলাইনে সিস্টেমে সবচেয়ে ভাল কাজ করে কারণ আপনি সাধারণত কয়েকটি সংখ্যক সারিই পুনরুদ্ধার বা উপস্থাপিত করছেন, সুতরাং ফলস্বরূপ সেটগুলিতে আপনি যে স্থানগুলি পেয়ে যাবেন তাদের "rtrim" করা একটি তুচ্ছ কাজ যা লক্ষ লক্ষ লোকের সাথে যোগ দেওয়ার বিপরীতে tri অন্য টেবিলের এক টেবিল থেকে কয়েক মিলিয়ন সারি সারি।

CHAR অনলাইন সিস্টেমে বারচারে বোঝার অন্য কারণ হ'ল এটি পৃষ্ঠা বিভাজন হ্রাস করে। চর ব্যবহার করে আপনি সেই স্থানটি মূলত "সংরক্ষণ" করছেন (এবং অপচয় করছেন) সুতরাং যদি কোনও ব্যবহারকারী পরে আসে এবং সেই কলামটিতে আরও ডেটা রাখে এসকিউএল এর জন্য ইতিমধ্যে স্থান বরাদ্দ করেছে এবং এটি যায়।

CHAR ব্যবহারের আর একটি কারণ দ্বিতীয় কারণের মতো। যদি কোনও প্রোগ্রামার বা ব্যবহারকারী লক্ষ লক্ষ সারিতে একটি "ব্যাচ" আপডেট করে থাকে, উদাহরণস্বরূপ একটি নোট ফিল্ডে কিছু বাক্য যুক্ত করে, আপনি তাদের ডিবিএর মধ্যরাতে কোনও কল পাবেন না কেন এই ভেবে যে তাদের ড্রাইভগুলি পূর্ণ। অন্য কথায়, এটি একটি ডাটাবেসের আকারের আরও অনুমানযোগ্য বৃদ্ধির দিকে পরিচালিত করে।

সুতরাং সেগুলি তিনটি উপায়ে একটি অনলাইন (ওলটিপি) সিস্টেমটি চরের ওপরে বর্ণচালায় সুবিধা পেতে পারে। আমি কোনও গুদাম / বিশ্লেষণ / ওএলএপ দৃশ্যে খুব কমই চর ব্যবহার করি কারণ সাধারণত আপনার কাছে এত বেশি ডেটা থাকে যে সমস্ত চর কলামগুলি প্রচুর অপচয়যোগ্য স্থান যুক্ত করতে পারে।

মনে রাখবেন চরটি আপনার ডাটাবেসটিকে অনেক বড় করে তুলতে পারে তবে বেশিরভাগ ব্যাকআপ সরঞ্জামগুলিতে ডেটা সংকোচন থাকে যাতে আপনার ব্যাকআপগুলি প্রায় একই আকারের হয়ে থাকে যেমন আপনি বার্চার ব্যবহার করেছেন। উদাহরণস্বরূপ লাইটস্পিড বা রেডগেট এসকিউএল ব্যাকআপ।

অন্য ব্যবহার হ'ল একটি নির্দিষ্ট প্রস্থের ফাইলে ডেটা রফতানি করার জন্য তৈরি করা দর্শন। ধরা যাক আমাকে একটি মেইনফ্রেমে পড়ার জন্য ফ্ল্যাট ফাইলে কিছু তথ্য রফতানি করতে হবে। এটি নির্দিষ্ট প্রস্থ (সীমিত নয়)। আমি আমার "স্টেজিং" টেবিলটিতে ডেটাটি ভারচার হিসাবে সংরক্ষণ করতে চাই (সুতরাং এটি আমার ডাটাবেসে কম জায়গা ব্যয় করে) এবং তারপরে এটির চার্জের সমতুল্য সমস্ত কিছু কাস্ট করার জন্য একটি ভিউ ব্যবহার করে, সেই কলামের জন্য নির্দিষ্ট প্রস্থের প্রস্থের সাথে সামঞ্জস্য করে । উদাহরণ স্বরূপ:

create table tblStagingTable (
pkID BIGINT (IDENTITY,1,1),
CustomerFirstName varchar(30),
CustomerLastName varchar(30),
CustomerCityStateZip varchar(100),
CustomerCurrentBalance money )

insert into tblStagingTable
(CustomerFirstName,CustomerLastName, CustomerCityStateZip) ('Joe','Blow','123 Main St Washington, MD 12345', 123.45)

create view vwStagingTable AS
SELECT CustomerFirstName = CAST(CustomerFirstName as CHAR(30)),
CustomerLastName = CAST(CustomerLastName as CHAR(30)),
CustomerCityStateZip = CAST(CustomerCityStateZip as CHAR(100)),
CustomerCurrentBalance = CAST(CAST(CustomerCurrentBalance as NUMERIC(9,2)) AS CHAR(10))

SELECT * from vwStagingTable

এটি দুর্দান্ত কারণ অভ্যন্তরীণভাবে আমার ডেটা কম স্থান নেয় কারণ এটি ভারচর ব্যবহার করে। তবে আমি যখন ডিটিএস বা এসএসআইএস ব্যবহার করি বা এসএসএমএস থেকে নোটপ্যাডে কেবল একটি কাটা এবং পেস্ট করি, তখন আমি ভিউটি ব্যবহার করতে পারি এবং সঠিক স্থানটি সঠিকভাবে পেতে পারি। ডিটিএসে আমাদের কাছে একটি বৈশিষ্ট্য ছিল, অভিশাপ আমি ভুলে যাই আমি মনে করি এটি "প্রস্তাবিত কলাম" বা কিছু বলা হয়েছিল। এসএসআইএস-এ আপনি আর এটি করতে পারবেন না, আপনাকে ফ্ল্যাট ফাইল সংযোগ পরিচালককে ক্লান্তিকরভাবে সংজ্ঞা দিতে হবে। তবে যেহেতু আপনার নিজের দেখার ব্যবস্থা রয়েছে তাই এসএসআইএস প্রতিটি কলামের প্রস্থ জানতে পারে এবং আপনার ডেটা প্রবাহের কার্যগুলি তৈরি করার সময় এটি প্রচুর সময় সাশ্রয় করতে পারে।

সুতরাং নীচের লাইন ... বার্চার ব্যবহার করুন। চর ব্যবহার করার জন্য খুব অল্প সংখ্যক কারণ রয়েছে এবং এটি কেবল কার্য সম্পাদনের কারণে। আপনার যদি কয়েক মিলিয়ন সারিগুলির হ্যান্ড্রেন্ডের সাথে একটি সিস্টেম থাকে তবে ভবিষ্যদ্বাণীগুলি হ'ল ডিস্ট্রিমেন্টিক (চর) তবে বেশিরভাগ সিস্টেমে চর ব্যবহার করে কেবল স্থান নষ্ট করা হয়।

আশা করি এইটি কাজ করবে. জেফ


আপনি বলছেন যে স্থির চ্যাট কেবল সংরক্ষণের সময়ই বেশি স্থান গ্রহণ করে না, আপনি যখন যেমন যান ঠিক তেমন স্থানান্তরিত বা "স্থানান্তরিত "ও হয়? উদাহরণস্বরূপ ডিবি সার্ভার থেকে আমার ক্লায়েন্টের কাছে? আমরা কখন সেই নাল বাইটগুলি হারাব?
লাল মটর

9

পারফরম্যান্স সুবিধাগুলি রয়েছে তবে এখানে একটি উল্লেখ করা হয়নি: সারি মাইগ্রেশন। চর সহ, আপনি পুরো স্থানটি আগাম সংরক্ষণ করে রাখেন let's সুতরাং আসুন আমরা বলি যে আপনার কাছে একটি চর (1000) রয়েছে এবং আপনি 10 টি অক্ষর সংরক্ষণ করেন, আপনি সমস্ত 1000 অক্ষর স্থান ব্যবহার করবেন। একটি ভার্চর 2 (1000) এ আপনি কেবলমাত্র 10 টি অক্ষর ব্যবহার করবেন। আপনি ডেটা পরিবর্তন করার সময় সমস্যাটি আসে comes ধরা যাক আপনি এখন কলামটি 900 আপডেট করে আপডেট করেছেন update এটা সম্ভব যে ভার্চর প্রসারিত করার স্থানটি বর্তমান ব্লকে উপলব্ধ নয়। সেক্ষেত্রে, ডিবি ইঞ্জিনটি অবশ্যই সারিটি অন্য একটি ব্লকে স্থানান্তর করতে হবে এবং মূল ব্লকের একটি নতুন পকেটে নতুন সারিতে একটি পয়েন্টার তৈরি করতে হবে। এই ডেটাটি পড়তে, ডিবি ইঞ্জিনকে এখন 2 টি ব্লক পড়তে হবে।
ভারোচর বা চরটি আরও ভাল এটির পক্ষে কেউ বলতে পারেন না। সময় ব্যবসায়ের জন্য একটি জায়গা রয়েছে এবং ডেটা আপডেট করা হবে কিনা তা বিবেচনা করে, বিশেষত যদি এটির বাড়ার ভাল সম্ভাবনা থাকে।


আমি মনে করি আপনার পোস্টে একটি টাইপ আছে - varchar2 (1000) CHAR (1000) হওয়া উচিত নয়?
ম্যাট রোগিশ

8

প্রাথমিক পারফরম্যান্স অপটিমাইজেশন এবং সেরা অনুশীলন ধরণের নিয়ম ব্যবহারের মধ্যে পার্থক্য রয়েছে। যদি আপনি এমন নতুন সারণী তৈরি করে থাকেন যেখানে আপনার সর্বদা একটি নির্দিষ্ট দৈর্ঘ্যের ক্ষেত্র থাকবে, তবে CHAR ব্যবহার করা বোধগম্য হয়, সেই ক্ষেত্রে আপনার এটি ব্যবহার করা উচিত। এটি প্রারম্ভিক অপ্টিমাইজেশন নয়, বরং থাম্বের নিয়ম (বা সেরা অনুশীলন) প্রয়োগ করছে।

যেমন - আপনার যদি একটি 2 অক্ষরের রাজ্য ক্ষেত্র থাকে তবে CHAR (2) ব্যবহার করুন। আপনার যদি প্রকৃত রাজ্যের নামগুলি সহ কোনও ক্ষেত্র থাকে তবে VARCHAR ব্যবহার করুন।


8

কলামটি মার্কিন স্টেট কোডের মতো স্থির মান সংরক্ষণ না করে আমি বার্ছার বেছে নেব - যা সর্বদা ২ টি চর দীর্ঘ এবং বৈধ মার্কিন যুক্তরাষ্ট্রের কোডগুলির তালিকার প্রায়শই পরিবর্তন হয় না :)।

প্রতিটি অন্যান্য ক্ষেত্রে, এমনকি হ্যাশ পাসওয়ার্ড (যা দৈর্ঘ্য স্থির হয়) সংরক্ষণ করার মতো, আমি বার্চারটি বেছে নেব।

কেন - চর ধরণের কলামটি সর্বদা শূন্যস্থান দিয়ে পরিপূর্ণ হয়, যা কলামের জন্য My_column হিসাবে "ABC 'মানের সাথে চর (5) হিসাবে সংজ্ঞায়িত করে:

my_column = 'ABC' -- my_column stores 'ABC  ' value which is different then 'ABC'

মিথ্যা।

এই বৈশিষ্ট্যটি বিকাশের সময় অনেকগুলি বিরক্তিকর বাগের দিকে নিয়ে যেতে পারে এবং পরীক্ষাকে আরও শক্ত করে তোলে।


1
কমপক্ষে এমএসএসকিউএল সার্ভারে, 'abc' = 'abc'। আমি যদি এই বৈশিষ্ট্যটি পছন্দ করি বা ঘৃণা করি তবে আমি কখনই বেশিরভাগটা খুঁজে পাইনি ....
মার্ক ব্র্যাকেট


6

যদি ক্ষেত্রের সমস্ত ডেটা মান একই দৈর্ঘ্য হয় তবে CHAR VARCHAR এর চেয়ে কম সঞ্চয় স্থান গ্রহণ করে। এখন সম্ভবত ২০০৯-এ একটি ৮০০ গিগাবাইট ডাটাবেস 810 গিগাবাইটের মতো সমস্ত অভিপ্রায় এবং উদ্দেশ্যগুলির জন্য সমান, যদি আপনি ভারচারগুলিকে চারে রূপান্তর করেন তবে সংক্ষিপ্ত স্ট্রিংগুলির জন্য (1 বা 2 অক্ষর), CHAR এখনও একটি শিল্প "সেরা অনুশীলন" আমি বলব।

এখন আপনি যদি বিভিন্ন ধরণের ডেটা টাইপের দিকে লক্ষ্য করেন তবে বেশিরভাগ ডাটাবেসগুলি এমনকি একা পূর্ণসংখ্যার (বিট, টিনি, ইনট, বিগিন্ট) সরবরাহ করে তবে একে অপরের থেকে একটি বেছে নেওয়ার কারণ রয়েছে। কেবলমাত্র প্রতিবার বিগিন্ট নির্বাচন করা আসলে ক্ষেত্রের উদ্দেশ্য এবং ব্যবহারগুলি সম্পর্কে কিছুটা অজ্ঞ being যদি কোনও ক্ষেত্রটি কেবল বছর বয়সের একজন ব্যক্তির প্রতিনিধিত্ব করে তবে একটি বিগিন্ট ওভারকিল। এখন এটি অগত্যা "ভুল" নয়, তবে এটি দক্ষ নয়।

তবে এটি একটি আকর্ষণীয় যুক্তি, এবং সময়ের সাথে সাথে ডেটাবেসগুলির উন্নতি হওয়ায়, এটি যুক্তিযুক্ত হতে পারে যে CHAR বনাম ভ্রচার কম প্রাসঙ্গিক হয়।


4

আমি জিম ম্যাককিথের মন্তব্যে দাঁড়িয়ে আছি।

এছাড়াও, যদি আপনার টেবিলটিতে কেবল CHAR কলাম থাকে তবে সূচক এবং পূর্ণ টেবিল স্ক্যানগুলি দ্রুত হয়। মূলত অপ্টিমাইজারটি প্রতিটি রেকর্ডের মধ্যে কেবল CHAR কলাম থাকতে পারে তবে প্রতিটি রেকর্ডার কতটা বড় তা ভবিষ্যদ্বাণী করতে সক্ষম হবে, যখন এটিতে প্রতিটি VARCHAR কলামের আকারের মান পরীক্ষা করা দরকার value

আপনি যদি পূর্ববর্তী বিষয়বস্তুর চেয়ে বড় আকারে কোনও ভ্র্যাচার কলাম আপডেট করেন তবে আপনি ডাটাবেসটিকে তার সূচকগুলি পুনঃনির্মাণ করতে বাধ্য করতে পারেন (কারণ আপনি ডাটাবেসটিকে শারীরিকভাবে ডিস্কে রেকর্ডটি সরিয়ে নিতে বাধ্য করেছিলেন)। CHAR কলামগুলির সাথে যখন কখনও ঘটবে না never

তবে আপনার টেবিলটি বিশাল না হলে আপনি সম্ভবত পারফরম্যান্স হিট সম্পর্কে চিন্তা করবেন না।

জিক্সট্রার বুদ্ধিমান কথা মনে রাখবেন। প্রাথমিক পারফরম্যান্স অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল root


4
আপনার মন্তব্যে কিছুটা জল্পনা রয়েছে। আমি সময় এবং সময় আবার এই ধরণের অনুমান পরীক্ষা করা এবং সঠিক বিপরীত সত্য প্রমাণিত হয়েছে দেখেছি। সমস্যাটি হ'ল অনেক ইঞ্জিনিয়াররা সুসমাচার হিসাবে এই জাতীয় তথ্য নেবেন। অনুগ্রহপূর্বক, পরীক্ষার কেসগুলি তৈরি করুন যা আপনার আসল পরিস্থিতি প্রতিফলিত করে।
ইথান পোস্ট

ইথান পুরোপুরি সঠিক। এটি তাই বাস্তবায়নের উপর নির্ভর করে যা আপনি প্রকৃত (পণ্য, সংস্করণ) এর উল্লেখ ছাড়াই এটি সম্পূর্ণ অকেজো।
ডেভিড স্মিট

আপনি যখন কোনও CHARকলাম আপডেট করবেন তখন সূচিপত্রগুলি ঠিক পাশাপাশি আপডেট করা দরকার। এক্ষেত্রে কোনও ভোরচার বা CHAR কলাম আপডেট করার ক্ষেত্রে কোনও পার্থক্য নেই। আপডেট FOOকরার কথা ভাবুন BAR
a_horse_with_no_name

4

অনেক লোক উল্লেখ করেছে যে আপনি যদি CHAR ব্যবহার করে মানটির সঠিক দৈর্ঘ্য জানেন তবে কিছু সুবিধা রয়েছে। তবে মার্কিন যুক্তরাষ্ট্রের রাজ্যগুলিকে সংরক্ষণ করার সময় CHAR (2) আজ দুর্দান্ত, যখন আপনি বিক্রয়ের মাধ্যমে এই বার্তা পান যে 'আমরা কেবলমাত্র অস্ট্রেলিয়ার কাছে আমাদের প্রথম বিক্রয় করেছি', আপনি ব্যথার জগতে রয়েছেন। আমি সবসময় ভবিষ্যতের ইভেন্টগুলি কভার করতে একটি 'নির্ভুল' অনুমান করার চেয়ে ক্ষেত্রগুলি কতটা প্রয়োজন বলে মনে করি তা পর্যালোচনা করে প্রেরণ করি। VARCHAR আমাকে এই ক্ষেত্রে আরও নমনীয়তা দেবে।


3

আমি মনে করি আপনার ক্ষেত্রে সম্ভবত ভারচর না নেওয়ার কোনও কারণ নেই। এটি আপনাকে নমনীয়তা দেয় এবং বেশ কয়েকটি প্রতিক্রিয়াশীল হিসাবে যেমন উল্লেখ করা হয়েছে, পারফরম্যান্স এখন এমনই হয়েছে যে খুব নির্দিষ্ট পরিস্থিতিতে বাদ দিয়ে আমাদের মরির প্রাণীরা (গুগল ডিবিএর বিপরীতে) পার্থক্যটি লক্ষ্য করবে না।

ডিবি টাইপগুলির কথাটি মনে করার মতো একটি আকর্ষণীয় বিষয় হ'ল স্ক্লাইট (একটি চমত্কার চিত্তাকর্ষক পারফরম্যান্স সহ একটি জনপ্রিয় মিনি ডাটাবেস) সবকিছুতে স্ট্রাইজ এবং স্ট্রাইক হিসাবে ডাটাবেজে রাখে।

আমি সর্বদা ভারচর ব্যবহার করি এবং সাধারণত আমার প্রয়োজনের চেয়ে এটি আরও বড় করে তোলে। যেমন। ফার্স্টনামের জন্য 50, যেমন আপনি বলেছিলেন যে কেন কেবল নিরাপদ থাকবেন না।


3

আমি চরগুলি কখনও ব্যবহার করতাম না। আমি অনেক লোকের সাথে এই বিতর্ক করেছি এবং তারা সর্বদা ক্লান্ত ক্লিচ এনে দেয় যে চরটি আরও দ্রুত। আচ্ছা আমি বলি, কত দ্রুত? আমরা এখানে কি সম্পর্কে কথা বলছি, মিলি সেকেন্ড, সেকেন্ড এবং যদি তাই হয় কত? আপনি আমাকে বলছেন কারণ কেউ এর কয়েক মিলি সেকেন্ড দ্রুত দাবি করেছে, আমাদের সিস্টেমে বাগ সংশোধন করার জন্য প্রচুর পরিমাণে কঠোর প্রচলন করা উচিত?

সুতরাং এখানে কয়েকটি বিষয় যা আপনি অনুসরণ করবেন:

প্রতিটি ক্ষেত্র প্যাড করা হবে, তাই আপনি সর্বদা কোড সহ শেষ করুন যা সর্বত্র RTRIMS রয়েছে। এটি দীর্ঘ ক্ষেত্রগুলির জন্য একটি বিশাল ডিস্ক স্পেস বর্জ্য।

এখন ধরা যাক আপনার কাছে কেবলমাত্র একটি চরিত্রের চর ক্ষেত্রের পঞ্চম উদাহরণ রয়েছে তবে ক্ষেত্রটি alচ্ছিক। যদি কেউ field ক্ষেত্রে কোনও খালি স্ট্রিংটি পাস করে তবে এটি একটি স্থান হয়ে যায়। সুতরাং যখন অন্য অ্যাপ্লিকেশন / প্রক্রিয়া এটি অনুসন্ধান করে, তারা একটি একক স্থান পায়, যদি তারা rtrim ব্যবহার না করে। আমাদের কাছে এক্সএমএল ডকুমেন্টস, ফাইল এবং অন্যান্য প্রোগ্রাম রয়েছে, oneচ্ছিক ক্ষেত্রগুলিতে এবং কেবল কিছু বিরতিতে কেবলমাত্র একটি স্থান প্রদর্শন করুন।

সুতরাং এখন আপনাকে তা নিশ্চিত করতে হবে যে আপনি নালাগুলি এবং খালি স্ট্রিং নয়, চর ক্ষেত্রের দিকে চলে যাচ্ছেন। তবে এটি নাল সঠিক ব্যবহার নয়। এখানে নাল ব্যবহার করা হয়। বলুন যে আপনি একজন বিক্রেতার কাছ থেকে একটি ফাইল পেয়েছেন

নাম | জেন্ডার | সিটি

বব || লস অ্যাঞ্জেলেস

যদি আপনি বব প্রবেশের চেয়ে লিঙ্গ নির্দিষ্ট না করে থাকে, সারণীতে খালি স্ট্রিং এবং লস অ্যাঞ্জেলেস। এখন বলুন যে আপনি ফাইলটি পান এবং এর ফর্ম্যাট পরিবর্তন হয় এবং লিঙ্গ আর অন্তর্ভুক্ত থাকে না তবে অতীতে ছিল।

নাম | সিটি

বব | সিয়াটেল

ভাল এখন যেহেতু লিঙ্গ অন্তর্ভুক্ত করা হয়নি, তাই আমি নাল ব্যবহার করব। ভারচররা সমস্যা ছাড়াই এটি সমর্থন করে।

অন্যদিকে চর আলাদা। আপনাকে সর্বদা নাল পাঠাতে হবে। আপনি যদি কখনও খালি স্ট্রিং প্রেরণ করেন তবে আপনি এমন একটি ক্ষেত্রের সাথে সমাপ্ত হবেন যেখানে এর ফাঁকা স্থান রয়েছে।

চরগুলি থেকে এবং প্রায় 20 বছরের বিকাশের মধ্যে আমাকে যে সমস্ত বাগগুলি ঠিক করতে হয়েছিল তা দিয়ে আমি এগিয়ে যেতে পারতাম।


2

কলামের মানের জন্য প্রকৃত প্রয়োজনীয় আকার গণনা এবং ভার্চারের জন্য জায়গা বরাদ্দ করার ক্ষেত্রে কিছু ছোট প্রসেসিং ওভারহেড রয়েছে, সুতরাং মানটি সর্বদা কত দিন থাকবে তা আপনি যদি নিশ্চিত হন তবে চরটি ব্যবহার করা এবং হিট এড়ানো ভাল।


2

এটি ক্লাসিক স্পেস বনাম পারফরম্যান্স ট্রেড অফ।

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

সুতরাং, যদি স্থানটি কোনও সমস্যা না হয় তবে পারফরম্যান্সের জন্য চর আরও ভাল তবে আপনি যদি ডাটাবেসটির আকারটি নীচে রাখতে চান তবে ভারচারগুলি আরও ভাল।


2

ফ্র্যাগমেন্টেশন। চর স্থান সংরক্ষণ করে এবং ভারচর করে না। পৃষ্ঠার বিভাজনটি বার্চারে আপডেটের জন্য প্রয়োজন হতে পারে।


অন্যান্য অনেক কারণের কারণে, CHARকলাম আপডেট করার সময় একটি পৃষ্ঠা বিভাজন ঘটতে পারে ।
রিক জেমস

1

ভারচার মানগুলি ব্যবহার করার সময় এসকিউএল সার্ভারের সেই কলামটি সম্পর্কে কিছু তথ্য সঞ্চয় করতে প্রতি সারিতে অতিরিক্ত 2 বাইট প্রয়োজন হয় যখন আপনি চর ব্যবহার করেন তবে এটির প্রয়োজন নেই যতক্ষণ না আপনি


0

কিছু এসকিউএল ডেটাবেজে, অফসেটগুলি অনুকূলিত করার জন্য ভর্চার তার সর্বোচ্চ আকারে প্যাড করা হবে, এটি পুরো টেবিল স্ক্যান এবং সূচকগুলি দ্রুততর করতে।

এ কারণে, আপনার কাছে কোনও CHAR (200) এর তুলনায় VARCHAR (200) ব্যবহার করে কোনও স্থানের সঞ্চয় নেই


3
কোন ডাটাবেসগুলি সেভাবে ভ্রচারকে বাস্তবায়ন করে?
Troels আরভিন

5
গম্ভীরভাবে, কোন ডাটাবেস এটি সেভাবে প্রয়োগ করে? আপনি সাধারণত যা বর্ণনা করেন তা বর্ণের ক্ষেত্রে নয়, CHAR- এ প্রযোজ্য।
রিচার্ড সিমিস

যদি একই টেবিলে চরের এবং বর্ণেরগুলি থাকে তবে মাইএসকিএল বার্চরটিকে চরগুলিতে রূপান্তর করবে।
ম্যালফিস্ট

মাইএসকিউএল মন্তব্যগুলির আমার ব্যাখ্যাটি হ'ল এটি প্রাথমিক টেবিল স্টোরেজের ক্ষেত্রে প্রযোজ্য নয়, তবে সম্ভবত টেম্প টেবিলগুলির জন্য এটি প্রাসঙ্গিক হতে পারে eg গ্রুপিং / ডেটা বাছাইয়ের জন্য। dev.mysql.com/doc/refman/8.0/en/char.html stackoverflow.com/questions/262238/...
টমাস ডব্লিউ

0

CHAR (NCHAR) এবং VARCHAR (NVARCHAR) ব্যবহার করে ডাটাবেস সার্ভার যেভাবে ডেটা সঞ্চয় করে তার মধ্যে পার্থক্য নিয়ে আসে। প্রথমটি শূন্যস্থানগুলি অনুসরণ করে; এসকিউএল সার্ভার ফাংশনে লাইক অপারেটরের সাথে ব্যবহার করার সময় আমি সমস্যার মুখোমুখি হয়েছি। সুতরাং আমাকে এটি সর্বদা ভিউচারার (এনভিচারচার) ব্যবহার করে নিরাপদ করতে হবে।

উদাহরণস্বরূপ, যদি আমাদের একটি টেবিলে টেস্ট থাকে (আইডি আইএনটি, স্ট্যাটাস CHAR (1)) , এবং আপনি নীচের মতো কিছু নির্দিষ্ট মান সহ সমস্ত রেকর্ড তালিকাভুক্ত করতে একটি ফাংশন লিখেন:

CREATE FUNCTION List(@Status AS CHAR(1) = '')
RETURNS TABLE
AS
RETURN
SELECT * FROM TEST
WHERE Status LIKE '%' + @Status '%'

এই ফাংশনে আমরা প্রত্যাশা করি যে আমরা যখন ডিফল্ট প্যারামিটার রাখি তখন ফাংশনটি সমস্ত সারি ফিরিয়ে দেবে, তবে বাস্তবে তা হয় না। @ স্ট্যাটাস ডেটা টাইপটি ভ্রচারে পরিবর্তন করুন সমস্যার সমাধান করবে।


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