ইউটিএফ -8: সাধারণ? বিন? ইউনিকোড?


279

আমি বিভিন্ন ধরণের ডেটার জন্য আমার কী কোলেশন ব্যবহার করা উচিত তা জানার চেষ্টা করছি। আমি যে সামগ্রী সংরক্ষণ করব সেগুলির 100% ব্যবহারকারী-জমা দেওয়া।

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

  1. আমি কি ইউটিএফ -8 জেনারেল বা ইউটিএফ -8 ইউনিকোড সিআই কলামগুলিতে ব্যবহারকারী-জমা দেওয়া সামগ্রী সংরক্ষণ করব?
  2. UTF-8 বাইনারি কোন ধরণের ডেটা প্রযোজ্য?

16
পার্শ্ব নোট তবে পরিবর্তে utf8, utf8mb4সম্পূর্ণ ইউটিএফ -8 সমর্থনের জন্য ব্যবহার করুন। এখানে মন্তব্য করা হচ্ছে কারণ এই জনপ্রিয় প্রশ্নের উত্তরগুলি এটিকে সম্বোধন করে না। mathiasbynens.be/notes/mysql-utf8mb4
স্টিভেন আর লুমিস

আপনি যদি কেস ভাঁজ, তবে অ্যাকসেন্ট সংবেদনশীলতা চান তবে দয়া করে bugs.mysql.com এ একটি অনুরোধ ফাইল করুন ।
রিক জেমস

বা bugs.mysql.com/bug.php?id=58797 এ "আমাকে প্রভাবিত করুন" এ ক্লিক করুন এবং একটি মন্তব্য যুক্ত করুন।
রিক জেমস

উত্তর:


299

সাধারণভাবে, utf8_general_ci utf8_unicode_ci এর চেয়ে দ্রুত তবে কম সঠিক।

এখানে পার্থক্য:

যে কোনও ইউনিকোড চরিত্রের সেটের জন্য, _ জেনারাল_সি কোলেশন ব্যবহার করে সঞ্চালিত ক্রিয়াকলাপগুলি _ ইউনিকোড_সি কোলেশনগুলির চেয়ে দ্রুততর হয় । উদাহরণস্বরূপ, utf8_general_ci কোলেশন জন্য তুলনা দ্রুত, তবে কিছুটা কম সঠিক, utf8_unicode_ci এর তুলনা তুলনায়। এর কারণ হ'ল utf8_unicode_ci ম্যাপিংগুলিকে সম্প্রসারণের মতো সমর্থন করে; এটি হ'ল, যখন একটি অক্ষর অন্যান্য অক্ষরের সংমিশ্রণের সমান হিসাবে তুলনা করে। উদাহরণস্বরূপ, জার্মান এবং কিছু অন্যান্য ভাষায় "ß" "ss" এর সমান। utf8_unicode_ci সংকোচনের এবং উপেক্ষাযোগ্য চরিত্রগুলিকেও সমর্থন করে। utf8_general_ci একটি উত্তরাধিকার সূচনা যা প্রসারণ, সংকোচনের বা উপেক্ষা করা অক্ষরকে সমর্থন করে না। এটি অক্ষরের মধ্যে কেবল এক থেকে একের তুলনা করতে পারে।

এর থেকে উদ্ধৃত: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

আরও বিশদ ব্যাখ্যার জন্য, দয়া করে মাইএসকিউএল ফোরামগুলি থেকে নিম্নলিখিত পোস্টটি পড়ুন: http://forums.mysql.com/read.php?103,187048,188748

Utf8_bin হিসাবে: উভয় utf8_general_ci এবং utf8_unicode_ci কেস-অবশ তুলনা সঞ্চালন। বিপরীতে , utf8_bin কেস-সংবেদনশীল (অন্যান্য পার্থক্যগুলির মধ্যে), কারণ এটি অক্ষরের বাইনারি মানগুলির তুলনা করে।


2
আমি মনে করি আপনার যদি _ ইউনিকোড_সিআই ব্যবহার করার উপযুক্ত কারণ না থাকে তবে _ জেনারাল_সি ব্যবহার করুন।
সাগি

4
এটি যদিও গভীরভাবে প্রশ্নের উত্তর দেয় না। এই কোলেশনগুলির মধ্যে ঠিক কী পার্থক্য রয়েছে?
পেক্কা

4
আপনি ঠিক বলেছেন, সরলতার জন্য সঠিক পার্থক্য এখানে সরবরাহ করা হয়নি। আমি ঠিক পার্থক্য সহ একটি পোস্টে একটি লিঙ্ক যুক্ত করেছি ।
সাগি

এনবি show collation;আপনাকে প্রতিটি অক্ষর সেটের জন্য ডিফল্ট কোলিশন দেখতে দেয়। 5.1 এর utf8_general_ciজন্য ডিফল্ট হিসাবে শো utf8
ডেভিড কার্বোনি

9
এমন কোনও সংস্থান আছে যা দুটি কোলেশনের মধ্যে প্রকৃত গতির পার্থক্যের আরও গভীরতায় যেতে পারে? আমরা কি পারফরম্যান্সের 0.1% ড্রপ বা 10% ড্রপের কথা বলছি?
এম্পরাম স্টাভ্যাঞ্জার

90

আপনার এই সত্যটি সম্পর্কেও সচেতন হওয়া উচিত, যে utf8_general_ci এর সাথে যখন একটি ভার্চর ক্ষেত্রটি অনন্য বা প্রাথমিক সূচক হিসাবে 'a' এবং 'á' এর মতো 2 টি মান সন্নিবেশ করানো হয় তখন একটি সদৃশ কী ত্রুটি ঘটবে।


3
ধন্যবাদ, অনুরূপ ব্যবহারকারীর নাম এড়াতে এটি দরকারী (উদাঃ "জোস" উপস্থিত থাকলে আমি অন্য কেউ "জোস" ব্যবহারকারীর তৈরি করতে চাই না) এনবি: এটি বেশিরভাগ ইউটিএফ 8 কোলিশনের ক্ষেত্রেও সত্য (হ'ল utf8_bin) holds সর্বাধিক সুরক্ষিত / নিরাপদ / সর্বাধিক বিস্তৃতutf8_unicode_ci
কোস্টা

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

33
  • utf8_binবিটকে অন্ধভাবে তুলনা করে। কোনও ক্ষেত্রে ভাঁজ নেই, অ্যাকসেন্ট স্ট্রিপিং নেই।
  • utf8_general_ciএকটি বাইটকে একটি বাইটের সাথে তুলনা করে। এটি কেস ভাঁজ এবং অ্যাকসেন্ট স্ট্রিপিং করে তবে 2-বর্ণের তুলনা নেই: এই কোলেশনে ijসমান নয় ij
  • utf8_*_ciভাষা-নির্দিষ্ট নিয়মের একটি সেট, তবে অন্যথায় পছন্দ হয় unicode_ci। কিছু বিশেষ ক্ষেত্রে: Ç, Č, ch,ll
  • utf8_unicode_ciতুলনা করার জন্য একটি পুরানো ইউনিকোড মান অনুসরণ করে। ij= ij, তবে ae! =æ
  • utf8_unicode_520_ciএকটি নতুন ইউনিকোড স্ট্যান্ডার্ড অনুসরণ করে। ae=æ

বিভিন্ন utf8 কোলিশনে কি সমান হয় তার বিশদগুলির জন্য কোলেশন চার্ট দেখুন ।

utf8, মাইএসকিউএল দ্বারা সংজ্ঞায়িত হিসাবে 1- থেকে 3-বাইট utf8 কোডের মধ্যে সীমাবদ্ধ। এটি ইমোজি এবং কিছু চীনাকে ছেড়ে দেয়। সুতরাং আপনি utf8mb4যদি ইউরোপের বাইরে অনেক বেশি যেতে চান তবে আপনার সত্যই স্যুইচ করা উচিত ।

উপরের পয়েন্টগুলি utf8mb4উপযুক্ত বানান পরিবর্তনের পরে প্রয়োগ হয় । এগিয়ে যাওয়া, utf8mb4এবং utf8mb4_unicode_520_ciপছন্দসই হয়।

  • utf16 এবং utf32 হল utf8 এর রূপসমূহ; কার্যত তাদের কোন লাভ নেই।
  • ucs2 "ইউটিফোড" এর চেয়ে "ইউনিকোড" এর কাছাকাছি; এটির কার্যত কোনও লাভ নেই।

1
পুনরায় "সাথে থাকুন": 8.0 কোলেশনগুলি দেখায় যে 8,0 utf8mb4 কলেশনে বিভিন্ন অক্ষর, ডিপথং ইত্যাদি কীভাবে তুলনা করা হয়; utf8 বেশিরভাগই একই রকম।
রিক জেমস

এবং ৮.০ কোলিশনগুলি 5.x এর তুলনায় উল্লেখযোগ্যভাবে দ্রুত গতিতে রয়েছে
রিক জেমস

পৃষ্ঠার উপরে utf8mb4_bin তালিকা করা ভাল হবে। আমি জানি এটি কোনও চরিত্রের সাথে মেলে না তবে এটি নবাগতদের পক্ষে ভাল good
হেন্ক পোলি

6

সত্যই, আমি অনন্য সূচক সহ কলামে 'é' এবং 'ই' এর মতো মানগুলি সংরক্ষণ করে পরীক্ষা করেছি এবং সেগুলি 'utf8_unicode_ci' এবং 'utf8_general_ci' উভয় ক্ষেত্রেই সদৃশ ত্রুটির সৃষ্টি করে। আপনি এগুলি কেবল 'utf8_bin' কোল্যাটেড কলামে সংরক্ষণ করতে পারেন।

এবং মাইএসকিএল ডক্স ( http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html এ ) এর উদাহরণগুলিতে 'utf8_general_ci' সংকলন সেট করার পরামর্শ দেয়।

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

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

@ মিররডেফেট ঠিক আছে, আমার সেখানে যুক্ত করা উচিত যে এই ত্রুটির কারণ হওয়ার জন্য কলামটির অনন্য সূচি থাকতে হবে। এটি আমার উত্তরে ইঙ্গিত দেয়।
ভায়োলি

3

গৃহীত উত্তর পুরানো।

আপনি যদি মাইএসকিউএল 5.5.3+ ব্যবহার করেন তবে আপনার ব্যবহারকারীদের দ্বারা টাইপ করা অক্ষরগুলি আপনাকে ত্রুটি দেয় না তা নিশ্চিত করার utf8mb4_unicode_ciপরিবর্তে ব্যবহার করুন utf8_unicode_ci

utf8mb4উদাহরণস্বরূপ ইমোজিগুলি সমর্থন করে, যেখানে utf8আপনাকে কয়েকশ এনকোডিং-সম্পর্কিত বাগ যেমন দিতে পারে:

Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1


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