কেন historতিহাসিকভাবে লোকেরা ডেটাবেস ক্ষেত্রের আকারের জন্য 255 নয় 256 ব্যবহার করে?


189

আপনি প্রায়শই দেখতে পান ডেটাবেস ক্ষেত্রগুলিতে 255 অক্ষর বিস্তৃত থাকে, চিরাচরিত / historicতিহাসিক কারণ কী? আমি ধারণা করছি এটি পেজিং / মেমরি সীমা এবং কার্য সম্পাদনের সাথে করার কিছু কিন্তু 255 এবং 256 এর মধ্যে পার্থক্য আমাকে সর্বদা বিভ্রান্ত করেছে।

varchar(255)

এটি একটি সক্ষমতা বা মাত্রা বিবেচনা করে সূচক নয় , কেন 255 কে 256 এর চেয়ে বেশি পছন্দ করা হচ্ছে? কোনও বাইট কোনও উদ্দেশ্যে (টার্মিনেটর বা নাল বা কোনও কিছুর জন্য) সংরক্ষিত?

সম্ভবত বর্ণাচর (0) একটি বাজে কথা (শূন্য ক্ষমতা আছে)? কোন ক্ষেত্রে 2 ^ 8 স্থান অবশ্যই 256 হওয়া উচিত?

কর্মক্ষমতা সুবিধা প্রদান করে এমন আরও কিছু কি রয়েছে? উদাহরণস্বরূপ বর্ণাচর (512) বর্ণচর (511) বা বর্ণচর (510) এর চেয়ে কম পারফর্মেন্ট কী?

পুরানো এবং নতুন সমস্ত সম্পর্কের ডাটাবেসের জন্য এই মানটি কি একই?

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

সম্পাদনা:

উত্তরের জন্য ধন্যবাদ, কিছু ধারণা আছে বলে মনে হচ্ছে যে একটি বাইট আকার সংরক্ষণের জন্য ব্যবহৃত হয়, তবে এটি আমার মনের মধ্যে বিষয়টি স্থির করে দেয় না।

যদি মেটা ডেটা (স্ট্রিং দৈর্ঘ্য) একই স্বতন্ত্র মেমরি / ডিস্কে সঞ্চয় করা থাকে তবে তা কিছুটা অর্থবোধ করে। মেটাডাটা 1 বাইট এবং স্ট্রিং ডেটা 255 বাইট, একে অপরের খুব সুন্দরভাবে উপযুক্ত হবে, এবং 256 সংক্ষিপ্ত বাইট স্টোরেজ, যা সম্ভবত পরিষ্কার এবং পরিপাটি ফিট হবে।

তবে ... যদি মেটাটাটা (স্ট্রিংয়ের দৈর্ঘ্য) প্রকৃত স্ট্রিং ডেটা (সম্ভবত একটি মাস্টার টেবিলের মধ্যে) থেকে আলাদাভাবে সংরক্ষণ করা হয়, তবে স্ট্রিংয়ের ডেটার দৈর্ঘ্যকে একটি বাইট দ্বারা সীমাবদ্ধ করার জন্য, কেবলমাত্র 1 বাইট পূর্ণসংখ্যা সংরক্ষণ করা সহজ because মেটাডাটা কিছুটা বিজোড় মনে হচ্ছে।

উভয় ক্ষেত্রেই এটি একটি সূক্ষ্মতা বলে মনে হবে যা সম্ভবত ডিবি বাস্তবায়নের উপর নির্ভর করে। 255 ব্যবহারের অনুশীলনটি বেশ বিস্তৃত বলে মনে হচ্ছে, তাই শুরুতে কোথাও কেউ অবশ্যই এর পক্ষে একটি ভাল কেস নিয়ে যুক্তি দেখিয়েছেন, কেউ কি মনে করতে পারে যে কেসটি ছিল / কী ছিল? প্রোগ্রামাররা কোনও কারণ ছাড়াই কোনও নতুন অনুশীলন গ্রহণ করবে না এবং এটি অবশ্যই একবারে নতুন হওয়া উচিত।


3
কারণ অক্ষর গণনা 0 থেকে শুরু করে এন -1। সুতরাং 256 টি অক্ষর বর্ণচক্র হিসাবে ঘোষণা করা হবে (255)। আমি ভুল না হলে।
বুহাকে সিন্ধি

3
হতে পারে কারণ আইটি লোকেরা 0 দিয়ে গণনা শুরু করে, 1% নয়)?
রোমেন লিনসোলাস

আমি মনে করি এটি পুরানো স্কুল প্রোগ্রামারদের সাথে করা উচিত, এমনকি আমরা এটি কেন করেছি তা স্মরণে রাখতে পারি না।
ক্রম্পী

7
@ এলিট জেন্টলম্যান: বন্ধনীতে সংখ্যাটি হ'ল আসল দৈর্ঘ্য নয় ... সি অ্যারে ঘোষণার মতো: x [256] এক্স [0] দেয় ... x [255]।
রেডপান্ডা কিউরিও

@romaintaz - তবে এমন একটি অ্যারে বিবেচনা করুন যা 1 টি আইটেম সংরক্ষণ করতে পারে। আপনি এটিকে কিছু ঘোষণা করেন [1] এবং এটিকে কিছুতে অ্যাক্সেস করুন [0]। প্রশ্নটি হ'ল এসকিউএল-তে আমরা কেন সক্ষমতাটিকে প্রথম নজরে যৌক্তিক বলে মনে হয় তার চেয়ে কম 1 বাইট হবে declare
অ্যান্ড্রু এম

উত্তর:


167

সর্বোচ্চ 255 অক্ষরের দৈর্ঘ্য সহ, ডিবিএমএস ক্ষেত্রে ডেটার দৈর্ঘ্য নির্দেশ করতে একটি একক বাইট ব্যবহার করতে বেছে নিতে পারে। সীমাটি 256 বা তার বেশি হলে দুটি বাইটের প্রয়োজন হবে।

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

আপনি যেমন লক্ষ্য করেছেন, এটি একটি .তিহাসিক অপ্টিমাইজেশন এবং সম্ভবত বর্তমানে বেশিরভাগ সিস্টেমে প্রাসঙ্গিক নয়।


দৈর্ঘ্যের জন্য বাইট সংরক্ষণ করা অর্থপূর্ণ, তবে ডাব্লুআরটি আপনার দ্বিতীয় প্যারাগ্রাফ, সম্ভবত দৈর্ঘ্যের একটি / মান / দৈর্ঘ্যের শূন্যটি বৈধ, তবে দৈর্ঘ্যের শূন্যের একটি / ক্ষমতা / বৈধ?
অ্যান্ড্রু এম

1
@ অ্যান্ড্রু: আমি কেবল চেষ্টা করেছি এবং পোস্টগ্র্যাসকিউএল প্রত্যাখ্যান করেছি varchar(0)। এটি সম্ভবত এটি কার্যকর নয় কারণ মানটি কেবল দুটি জিনিস হতে পারে খালি স্ট্রিং বা ন্যূনএলএল এবং তাই আপনি সম্ভবত এটির bitজন্য একটি ব্যবহার করতে পারেন।
গ্রেগ হিউগিল

সুতরাং এটিকে ধরে নেওয়া কি সত্য যে ক্ষমতাটি মেটাডেটা তথ্য হিসাবে একই সংকীর্ণ ব্লকের মধ্যে সংরক্ষিত আছে, এবং সেইজন্য ডিবি-র পক্ষে এই দুটি জিনিসের মোট (ডেটা এবং মেটাডেটা) এক পৃষ্ঠার মধ্যে রাখার সুবিধা রয়েছে (সম্ভবত 256 বাইট)?
অ্যান্ড্রু এম

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

3
ডিস্ক স্পেসের গুরুত্ব (এবং সূচী স্পেস) নয় কারণ একটি পৃষ্ঠায় 256 ফিট হতে পারে তবে 1 বাইট বনাম 2 বাইট (মিলিয়ন / বিলিয়ন / ট্রিলিয়ন সারিগুলির জন্য) একটি বড় পার্থক্য করে।
ypercubeᵀᴹ

35

255 মাইএসকিউএল 4 এবং এর আগের ভার্চার সীমা ছিল

এছাড়াও 255 অক্ষর + নাল টার্মিনেটর = 256

অথবা 1 বাইট দৈর্ঘ্যের বর্ণনাকারী একটি সম্ভাব্য পরিসীমা 0-255 অক্ষর দেয়


এবং এতে পড়া char foo[256]গুরুত্বপূর্ণ কারণ মেমরি পরিচালনা 2 এর ক্ষমতা পছন্দ করে দেখুন st দেখুন: স্ট্যাকওভারফ্লো / প্রশ্ন / 3190146/… বরাদ্দকরণ char foo[257]হয় মেমরি খণ্ডিত করবে বা 512 বাইট গ্রহণ করবে।
ebyrob

4
ভারচার স্ট্রিংয়ের দৈর্ঘ্য সংরক্ষণ করে না এবং তাই নাল টার্মিনেটরের প্রয়োজন নেই?
ক্রানচার

19

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


17

মাইএসকিউএল ম্যানুয়াল থেকে:

ডেটা প্রকার:
VARCHAR (এম), ভারবিনারি (এম)

স্টোরেজ প্রয়োজনীয়:
কলামের মানগুলিতে 0 - 255 বাইট প্রয়োজন হলে L + 1 বাইট, মানগুলিতে 255 বাইটের বেশি প্রয়োজন হতে পারে যদি এল + 2 বাইট

বুঝতে এবং পছন্দ করে নিন।


হ্যাঁ, তবে M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value. dev.mysql.com/doc/refman/5.7/en/stores-requirements.html
DLight


7

সর্বোচ্চ দৈর্ঘ্য 255 প্রতিটি ক্ষেত্রের দৈর্ঘ্য সংরক্ষণ করতে ডাটাবেস ইঞ্জিনকে কেবল 1 বাইট ব্যবহার করতে দেয়। আপনি সঠিক যে 1 বাইট স্পেস আপনাকে স্ট্রিংয়ের দৈর্ঘ্যের জন্য 2 ^ 8 = 256 স্বতন্ত্র মানগুলি সংরক্ষণ করতে দেয়।

তবে আপনি যদি ক্ষেত্রটিকে শূন্য দৈর্ঘ্যের পাঠ্য স্ট্রিংগুলি সঞ্চয় করার অনুমতি দেন তবে আপনাকে দৈর্ঘ্যে শূন্যটি সঞ্চয় করতে সক্ষম হতে হবে। সুতরাং আপনি শূন্য: 0-255 থেকে শুরু করে 256 স্বতন্ত্র দৈর্ঘ্যের মানগুলিকে মঞ্জুরি দিতে পারেন।


6

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


5

<<

বিট / বাইট স্টোরেজের মূলসূত্রগুলি পুনরায় সংগ্রহ করেছেন, 256 এবং 65536 এর মধ্যে কোনও পূর্ণসংখ্যার জন্য 256 এর নীচে এবং দুটি বাইটের জন্য একটি বাইট প্রয়োজন Hence সুতরাং, 511 বা 512 বা সেই বিষয়ে 65535 সংরক্ষণ করার জন্য এটির জন্য একই স্থান (দুটি বাইট) প্রয়োজন 65 .... সুতরাং এটি পরিষ্কার যে উপরোক্ত আলোচনায় উল্লিখিত এই যুক্তিটি ভার্চর (512) বা বর্ণচর (511) এর জন্য N / A।


4

8 বিট স্বাক্ষরযুক্ত = 256 বাইট

দৈর্ঘ্যের জন্য 255 অক্ষর + বাইট 0


3

এটি ব্যবহৃত হত যে সমস্ত স্ট্রিংয়ের জন্য NUL টার্মিনেটর বা "ব্যাকস্ল্যাশ-শূন্য" প্রয়োজন। আপডেট করা ডাটাবেসের মধ্যে তা নেই। এটি "5 0" সহ "255 টি পাঠ্যের অক্ষর" ছিল যা স্বয়ংক্রিয়ভাবে শেষে যুক্ত হয়েছিল তাই সিস্টেমটি জানত যে স্ট্রিংটি কোথায় শেষ হয়েছে। যদি আপনি VARCHAR (256) বলে থাকেন তবে এটি শেষ হয়ে যাবে 257 এবং তারপরে আপনি একটি চরিত্রের জন্য পরবর্তী নিবন্ধে থাকবেন। অযথা। এ কারণেই সবকিছুই VARCHAR (255) এবং VARCHAR (31) ছিল। অভ্যাসের বাইরে 255 টি আটকে আছে বলে মনে হয় তবে 31 এর 32 টি হয়ে যায় এবং 511 এর হয়ে যায় 512 এর হয়ে যায়। সেই অংশটি অদ্ভুত। নিজেকে ভিউচারার (256) লিখতে পারা শক্ত।


0

আমি মনে করি এটি আপনার প্রশ্নের উত্তর দিতে পারে। দেখে মনে হচ্ছে এটি পূর্ববর্তী সিস্টেমে ভার্চারের সর্বাধিক সীমা ছিল। আমি এটি অন্য স্ট্যাকওভারফ্লো প্রশ্নটি সরিয়ে ফেলেছি।

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

সমস্ত পাঠ্য-ভিত্তিক ক্ষেত্রগুলির জন্য জেনেরিক বার্চার (255) ব্যবহারের কি অসুবিধা রয়েছে?


0

বাইনারি সিস্টেমে ডেটা মেমরিতে সংরক্ষিত হয় এবং 0 এবং 1 বাইনারি ডিজিট হয়। বৃহত্তম বাইনারি সংখ্যা যা 1 বাইট (8-বিট) এ ফিট করতে পারে তা 11111111 যা দশমিক 255 এ রূপান্তর করে।

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