মাইএসকিউএল ভোরচার দৈর্ঘ্য এবং ইউটিএফ -8


84

মাইএসকিউএলে, আমি যদি VARCHAR(32)কোনও ইউটিএফ -8 সারণীতে একটি নতুন ক্ষেত্র তৈরি করি তবে এর অর্থ কি আমি সেই ক্ষেত্রের 32 বাইট ডেটা বা 32 অক্ষর (মাল্টি বাইট) সঞ্চয় করতে পারি?


@ নাএক্সা: আমি করিনি। তুমি ভাবি আমার উচিত?
অ্যালিক্স অ্যাক্সেল

আমি জানি না।) এটি আপনার প্রশ্ন এবং এটি আপনার উপর নির্ভর করে। আমি কেবল বলতে চেয়েছিলাম "অন্য উত্তরটি আরও সম্পূর্ণ দেখায়"।
নেক্সা

@robsch পূর্ববর্তী গৃহীত উত্তরগুলি সহজ এবং সঠিক ছিল। তবে জনপ্রিয় চাহিদা অনুযায়ী করুন আমি চাই আপনি তা গ্রহণ করেছেন।
অ্যালিক্স এক্সেল

উত্তর:


168

এই উত্তরটি আমার গুগল অনুসন্ধান ফলাফলের শীর্ষে প্রদর্শিত হয়েছিল তবে এটি সঠিক ছিল না:

বিভ্রান্তি সম্ভবত মাইএসকিএলের বিভিন্ন সংস্করণ পরীক্ষা করার কারণে হয়েছে।

  • সংস্করণ 4 বাইট গণনা করে
  • সংস্করণ 5 অক্ষর গণনা করে

http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

মাইএসকিউএল অক্ষর ইউনিটগুলিতে অক্ষর কলাম সংজ্ঞায় দৈর্ঘ্যের স্পেসিফিকেশন ব্যাখ্যা করে। (মাইএসকিউএল ৪.১ এর আগে কলাম দৈর্ঘ্যগুলি বাইটে ব্যাখ্যা করা হয়েছিল)) এটি CHAR, VARCHAR, এবং পাঠ্য প্রকারের ক্ষেত্রে প্রযোজ্য।

মজার বিষয় হল (আমি এটি সম্পর্কে ভাবিওনি) নীচে বর্ণা কলামের সর্বোচ্চ দৈর্ঘ্য utf8 দ্বারা প্রভাবিত হয়:

মাইএসকিউএল 5.0.3 এ একটি ভ্রচারের কার্যকর সর্বোচ্চ দৈর্ঘ্য এবং পরে সর্বাধিক সারি আকার (65,535 বাইট, যা সমস্ত কলামের মধ্যে ভাগ করা হয়) এবং ব্যবহৃত অক্ষর সেট সাপেক্ষে। উদাহরণস্বরূপ, utf8 টি অক্ষরের জন্য প্রতিটি চরিত্রের জন্য তিনটি বাইটের প্রয়োজন হতে পারে, সুতরাং utf8 অক্ষর সেটটি ব্যবহার করে এমন একটি VARCHAR কলাম সর্বোচ্চ 21,844 অক্ষর হিসাবে ঘোষিত হতে পারে।


48
এম ব্রাউন, এটি উল্লেখ করার জন্য ধন্যবাদ। একটি ভর্চার (10) ক্ষেত্র (ব্যবহার করে utf8mb4) "💩💩💩💩💩💩💩💩💩💩" (10 গাদা পো) সংরক্ষণ করতে পারে, এটি 10 ​​অক্ষর তবে 40 বাইট।
বেসিক 6

4
এই. এটিই একমাত্র সঠিক উত্তর। অনেক বেশি লোক 4 সংস্করণটির আচরণকে সুসমাচার হিসাবে বিশ্বাস করে।
ব্রেন্ডন বাইার্ড

4
মাইএসকিউএল 5 এর জন্য স্বীকৃত উত্তরটিও সঠিক - সন্নিবেশ করা সংখ্যাগুলি আসলে পুরো-প্রস্থের চর সেটের অংশ ছিল এবং বহু-বাইট ইউনিকোড অক্ষর ছিল, পাশাপাশি পোস্টার দ্বারা তিনি উল্লেখ করেছেন যে তিনি "32 মাল্টিবাইট ডেটা" সন্নিবেশ করেছিলেন। এটি লজ্জার বিষয় যাতে অনেকে ভুল বোঝে।
ব্যবহারকারী 193130

নিম্নলিখিত উত্সটি উদ্ধৃত করে, আমি বিশ্বাস করি যে একটি utf8 চরিত্রের জন্য বর্তমানে 1 থেকে 6 বাইটের মধ্যে কোথাও 6 বাইট প্রয়োজন। এটি একটি চরিত্রের সর্বাধিক 10922 হওয়ার জন্য সবচেয়ে খারাপ ক্ষেত্রে ডেকে আনে I আমি মনে করি। joelonsoftware.com/articles/Unicode.html
ইউএসওও

4
@ ইউসুওইও বর্তমানে, দেখে মনে হচ্ছে মাইএসকিউএল ইউটিএফ -8-এর 3-বাইট রূপ ব্যবহার করে, (মানক) 4-বাইট রূপের পরিকল্পনার সাথে স্থানান্তরিত করে: dev.mysql.com/doc/refman/8.0/en/charset- ইউনিকোড -utf8.html
ফ্লো

8

এটি আপনাকে 32 মাল্টি বাইট অক্ষর সংরক্ষণ করতে দেয়

ইউটিএফ -8 দিয়ে স্থান বাঁচাতে, CHAR এর পরিবর্তে VARCHAR ব্যবহার করুন। অন্যথায়, মাইএসকিউএল অবশ্যই একটি অক্ষরের জন্য প্রতিটি অক্ষরের জন্য তিনটি বাইট সংরক্ষণ করতে হবে চার্ট অক্ষর সেট utf8 কলাম কারণ এটি সর্বোচ্চ সম্ভাব্য দৈর্ঘ্য। উদাহরণস্বরূপ, মাইএসকিউএলকে একটি চিয়ার (10) চরিত্র সেট utf8 কলামের জন্য 30 বাইট সংরক্ষণ করতে হবে।

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html


আমি প্রায় কখনই ব্যবহার CHARকরি না এবং যখন করি তখন এটি মাল্টি-বাইট চরগুলি সঞ্চয় করার উদ্দেশ্যে নয়, তাই আমি নিরাপদ। কী সম্পর্কে VARCHAR, আপনি কি নিশ্চিত যে সীমাটি বহু-বাইট চরগুলিতে সংজ্ঞায়িত হয়েছে এবং একক বাইট চরগুলিতে নয়?
অ্যালিক্স অ্যাক্সেল

9
@jspcal: ইউটিএফ -8 সর্বোচ্চ তিনটি বাইট ব্যবহার করে, না 3 বা মাইএসকিউএল 4 টি বাইট সমর্থন করে না?
রেমি Lebeau

4
@ রেমিলিউউ আপনি ইউটিএফ ৮ সম্পর্কে ঠিক বলেছেন, তবে মাইএসকিউএল-এর পক্ষে নয়। বিভিন্ন utf8_xxx অক্ষর সেটগুলি সর্বোচ্চ 3-বাইট। Utf8mb4_xxx 4 বাইট অক্ষর নেয়। dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
বাটল বাটকাস

সময়ের অগ্রগতির সাথে দেখে মনে হচ্ছে মাইএসকিউএল অবশেষে প্রমিত 4-বাইট সংস্করণ ব্যবহার করবে (তবে লেখার সময় এটি এখনও নয়): dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8 .html
ফ্লো

6

কোলেশন সহ 32 টি মাল্টবাইটিস ডেটা , আমি মাত্র এক্সএএমপিপি দিয়ে পরীক্ষা করেছি।varchar(32)utf8_unicode_ci

1234567890123456789012345678901234567890

কেটে দেওয়া:

12345678901234567890123456789012

মনে রাখবেন যে এগুলি নিয়মিত ASCII অক্ষর নয়।


4
ইউটিএফ -8 স্ট্যান্ডার্ড এএসসিআইআই অক্ষর কেবলমাত্র একটি একক বাইটে সংরক্ষণ করা হবে - এটি সত্য পরীক্ষা করার জন্য আপনাকে অবশ্যই আপনার পরীক্ষার স্টিংয়ে কিছু মাল্টবাইট (অর্থাত্ অ-এসকিআই) অক্ষর ব্যবহার করতে হবে।
rjmackay

4
এটি ভুল, কমপক্ষে মাইএসকিউএল 5+ এর জন্য। বারচার বা চরের জন্য কলামের আকার নির্দিষ্ট করার সময়, এটি অক্ষরের ক্ষেত্রে নির্দিষ্ট করা হয়। আমি বিশ্বাস করি যে কোনও ভিআরচআরএআর (32) কলামের আসল আকার 32x3 + 1 = 97 বাইট হবে।
বাটল বাটকাস

4
@rjmackay '' মানকীয় ASCII অক্ষর নয়। en.wikedia.org/wiki/…
আলেক্সি লেবেদেভ

7
আমি ডিবিতে 40 টি ইউনিকোড অক্ষর sertedোকানো হয়েছিল, এবং 32 টি অক্ষরে ছাঁটাই হয়েছি। তবে দেখে মনে হচ্ছে লোকেরা মনে করে যে আমি এসকি বাইট ব্যবহার করেছি এবং 32 বাইটে ছাঁটাই করেছি। আশ্চর্যের কিছু নেই, আমি ডাউনটা পেয়েছি, হ্যাঁ।
আপনি

4
@ বুটল বুটকাস "আমি বিশ্বাস করি একটি Vर्चার (32) কলামের আসল আকার 32x3 + 1 = 97 বাইট হবে" আপনি যদি এটি ব্যবহার করেন utf8তবে এটি আপনি মাইএসকিউএলে ভাঙা ইউনিকোড সমর্থন পেতে পারেন। utf8mb4পরিবর্তে আপনার এনকোডিং ব্যবহার করা উচিত , কারণ সর্বাধিক রয়েছে। মাইএসকিউএল এর utf8 এর ভেরিয়েন্টের মতো 3 নয়, একটি utf-8 চরে 4 বাইট ...
স্টিজন ডি উইট

1

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


4
আমি পড়েছি যে কোনও টেবিলে যদি কোনও কলাম বারচর হয় তবে আপনি চর কলামগুলি থাকার সমস্ত সুবিধা হারাবেন। মূলত, দেখে মনে হচ্ছে সর্বাধিক উপকারের জন্য আপনাকে একটি টেবিলের মধ্যে সমস্ত বারচর বা সমস্ত চরের সাথে যেতে হবে। যদিও সত্য তা আমি জানি না।
বাটল বাটকাস

মাইআইএসএএম এর জন্য কিছু যুক্তি রয়েছে CHAR। InnoDB এর জন্য, আরও অনেকগুলি জিনিস চলছে যে "গতিশীল / স্থির সারি আকার" বিতর্কটি মূলত অপ্রাসঙ্গিক।
রিক জেমস

আইএমএইচও এখানে গুরুত্বপূর্ণ বিষয় হ'ল খুব কম দৈর্ঘ্যের জন্য এটি ব্যবহার করা উপকারী হতে পারে CHAR
টুলমেকারস্টেভ

0

আপনি যদি মাইএসকিউএল ইউটিএফ 8 কলামে পিএইচপি ইউটিএফ 8 স্ট্রিংটি সংরক্ষণ করতে ল্যাটিন 1 এনকোডিং (উদাহরণস্বরূপ পিএইচপি সহ) ব্যবহার করে ডাটাবেসের সাথে সংযুক্ত হন তবে আপনার ডাবল ইউটিএফ 8 এনকোডিং হবে।

যদি ইউটিএফ 8 স্ট্রিংটি $s32 টি অক্ষর দীর্ঘ তবে 64 বাইট দীর্ঘ এবং কলামটি VARCHAR(32)ইউটিএফ 8 হয় তবে ডাবল এনকোডিংটি স্ট্রিংটিকে $s64 টি অক্ষরের দীর্ঘ ইউটিএফ 8 স্ট্রিংয়ে রূপান্তর করবে যা ডাটাবেসে 32 টি প্রথম বাইটের সাথে মিলিয়ে তার 32 টি প্রথম অক্ষরে সংযুক্ত হবে এর $s। আপনি এই ভেবে শেষ করতে পারেন যে মাইএসকিউএল 5 মাইএসকিউএল 4 এর মতো আচরণ করে তবে বাস্তবে এটি একই প্রভাবের জন্য দ্বিতীয় কারণ।

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