Utf8_general_ci এবং utf8_unicode_ci এর মধ্যে পার্থক্য কী?


1062

মধ্যে utf8_general_ciএবং utf8_unicode_ciসেখানে কার্যকারিতা পদ কোন পার্থক্য আছে?


1
আরও দেখুন stackoverflow.com/questions/1036454/...
unor

6
আপনি যদি চান utf8[mb4]_unicode_ci, আপনি আরও পছন্দ করতে পারেন utf8[mb4]_unicode_520_ci
রিক জেমস

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

7
এখনও ভাল 8.0 এর ডিফল্ট utf8mb4_0900_ai_ci
রিক জেমস

উত্তর:


1591

এই দুটি সমাহার উভয়ই ইউটিএফ -8 চরিত্রের এনকোডিংয়ের জন্য। পার্থক্যগুলি কীভাবে পাঠ্যকে সাজানো এবং তুলনা করা হয়।

দ্রষ্টব্য: মাইএসকিউএল এর utf8mb4পরিবর্তে আপনাকে ব্যবহার করতে হবে utf8। বিভ্রান্তিমূলকভাবে, utf8প্রারম্ভিক মাইএসকিউএল সংস্করণগুলি থেকে একটি ত্রুটিযুক্ত ইউটিএফ -8 বাস্তবায়ন যা কেবল পশ্চাদপদ সামঞ্জস্যের জন্যই থেকে যায়। নির্দিষ্ট সংস্করণটির নাম দেওয়া হয়েছিল utf8mb4

দ্রষ্টব্য: মাইএসকিউএল এর নতুন সংস্করণগুলিতে ইউনিকোড বাছাইয়ের নিয়মগুলি আপডেট করা হয়েছে, যেমন utf8mb4_0900_ai_ci ইউনিকোড 9.0 এর ভিত্তিতে সমতুল্য নিয়মের জন্য নাম অনুসারে উপলব্ধ - এবং কোনও সমমানের _general বৈকল্পিক নেই। এখন এটি পড়তে থাকা লোকদের সম্ভবত হয় _unicode বা এর পরিবর্তে এই নতুন কোলিশনের একটি ব্যবহার করা উচিত_generalনীচে যা লিখিত রয়েছে তার বেশিরভাগটি এখন আর আগ্রহী নয় যদি আপনি তার পরিবর্তে আরও নতুন কোলিশান ব্যবহার করতে পারেন।

মূল পার্থক্য

  • utf8mb4_unicode_ci সর্বজনীন বাছাই এবং তুলনা করার জন্য অফিশিয়াল ইউনিকোড নিয়মের উপর ভিত্তি করে তৈরি করা হয়েছে, যা বিভিন্ন বিস্তৃত ভাষায় নির্ভুলভাবে সাজায়।

  • utf8mb4_general_ciগতির উন্নতির জন্য ডিজাইন করা অনেকগুলি শর্ট-কাট নেওয়ার সময় এটি করার পাশাপাশি লক্ষ্যগুলি বাছাইয়ের নিয়মের একটি সহজ সেট set এটি ইউনিকোড বিধি অনুসরণ করে না এবং এর ফলে কিছু পরিস্থিতিতে অনাকাঙ্ক্ষিত বাছাই বা তুলনা হয় যেমন নির্দিষ্ট ভাষা বা অক্ষর ব্যবহার করার সময়।

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

utf8mb4_unicode_ciওভার উপকারিতাutf8mb4_general_ci

utf8mb4_unicode_ci, যা বাছাই এবং তুলনা করার জন্য ইউনিকোড বিধিগুলি ব্যবহার করে, বিভিন্ন বিস্তৃত ভাষায় সঠিক বাছাই করার জন্য এবং বিস্তৃত বিশেষ অক্ষর ব্যবহার করার সময় একটি মোটামুটি জটিল অ্যালগরিদম নিয়োগ করে। এই বিধিগুলি ভাষা-নির্দিষ্ট কনভেনশনগুলিকে বিবেচনা করা প্রয়োজন; আমরা কী বর্ণনামূলক ক্রম বলব তার প্রত্যেকেই তাদের চরিত্রগুলি সাজান না।

লাতিন (যেমন "ইউরোপীয়") ভাষাগুলি যতদূর যায় ইউনিকোড বাছাই এবং utf8mb4_general_ciমাইএসকিউএল সরলিকৃত বাছাইয়ের মধ্যে খুব বেশি পার্থক্য নেই, তবে এখনও কয়েকটি পার্থক্য রয়েছে:

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

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

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

আপনার কি ব্যবহার করা উচিত?

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

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

একটি যুক্তি তৈরি করার দরকার আছে যে গতি যদি নির্ভুলতার চেয়ে আপনার কাছে গুরুত্বপূর্ণ হয় তবে আপনি কোনওভাবে বাছাইও করতে পারেন না। আপনার যদি এটি সঠিক হওয়ার প্রয়োজন না হয় তবে দ্রুত একটি অ্যালগরিদম তৈরি করা তুচ্ছ। সুতরাং, utf8mb4_general_ciএকটি সমঝোতা যা সম্ভবত গতির কারণে প্রয়োজন হয় না এবং সম্ভবত নির্ভুলতার কারণেও উপযুক্ত নয়।

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

পার্টস মানে কি

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

পরবর্তী, unicodeবা generalনির্দিষ্ট বাছাই এবং তুলনা বিধিগুলি উল্লেখ করে - বিশেষত, পাঠ্যকে যেভাবে সাধারণ করা হয় বা তুলনা করা হয়। Utf8mb4 চরিত্রের এনকোডিংয়ের জন্য নিয়মের অনেকগুলি সেট রয়েছে, যার সাথে unicodeএবং generalদু'টি হয়ে থাকে যা একটি নির্দিষ্টটির পরিবর্তে সমস্ত সম্ভাব্য ভাষায় ভালভাবে কাজ করার চেষ্টা করে। এই দুটি সেট নিয়মের মধ্যে পার্থক্য এই উত্তরের বিষয়। নোট যেটি unicodeইউনিকোড ৪.০ থেকে বিধি ব্যবহার করে। মাইএসকিউএল এর সাম্প্রতিক সংস্করণগুলি unicode_520ইউনিকোড 5.2 থেকে নিয়ম ব্যবহার করে এবং 0900ইউনিকোড 9.0 থেকে নিয়ম ব্যবহার করে "" ইউনিকোড_ "অংশটি বাদ দিচ্ছে) যুক্ত করে rule

এবং সবশেষে, utf8mb4অবশ্যই অভ্যন্তরীণভাবে অক্ষর এনকোডিং। এই উত্তরে আমি কেবল ইউনিকোড ভিত্তিক এনকোডিংগুলি নিয়েই কথা বলছি।


218
@KahWeeTeng আপনি উচিত না, কি কখনো ব্যবহার utf8_general_ci: এটা শুধু কাজ করে না। পঞ্চাশ বছর আগে থেকে ASCII বোকামির খারাপ পুরানো দিনগুলিতে এটি থ্রোকব্যাক। ইউসিডি থেকে ফোল্ডকেস মানচিত্র ছাড়া ইউনিকোড কেস-সংবেদনশীল মিলটি করা যায় না। উদাহরণস্বরূপ, "Σίσυφος" এর মধ্যে তিনটি ভিন্ন সিগমাস রয়েছে; বা "টিএসসিএইচ" এর ছোট হাতের অক্ষরটি কীভাবে "tschüβ", তবে "tschüβ" এর বড় হাতের অক্ষরটি "TSCHÜSS"। আপনি সঠিক হতে পারেন, বা আপনি দ্রুত হতে পারেন। সুতরাং আপনাকে অবশ্যই ব্যবহার করতে হবে utf8_unicode_ci, কারণ আপনি যদি নির্ভুলতার বিষয়ে চিন্তা করেন না, তবে এটিকে অনন্তর দ্রুততর করা তুচ্ছ।
tchrist

7
এটি পড়ার পরে আমি এটিও অনাবৃত করেছি যে utf8_unicode_ci সমতা তুলনার উদ্দেশ্যে একই সমান্তরাল ওজনযুক্ত যে কোনও অক্ষরকে সমান বিবেচনা করবে। এটি যেখানে "か" == "が"বা ক্ষেত্রে যায় "ǽ" == "æ"। বাছাইয়ের জন্য এটি বোঝা যায় তবে সমতার
মাদুর শ্যাফার

4
@ ড্যানহোরওয়াত নিজেকে মাইএসকিউএল এর পুরানো, আরও সীমাবদ্ধ ইউনকোডের সীমাবদ্ধ করার একমাত্র ব্যবহারিক কারণ হ'ল যদি আপনার কাছে মাইএসকিউএলের একটি পুরানো সংস্করণ থাকে যা আরও সম্পূর্ণ utf8mb4 সমর্থন করে না। 5.5.3 এর বয়স 5 বছরেরও বেশি। আমি প্রশংসা করি যে প্লেস্ক একটি পৃথক মাইএসকিউএল সময়সূচীতে চলে, তবে বেশিরভাগ ডিসট্রসগুলি এখন মাইএসকিউএল 5.5 এ রয়েছে এবং আপনি যদি এর উপাদানগুলি আপডেট করেন তবে প্লেস্ক 11.x মাইএসকিউএল 5.5 সমর্থন করে
থোমাস্রুটার

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

23
@DanHorvat utf8mb4হয় শুধুমাত্র সঠিক পছন্দ । সঙ্গে utf8আপনি UTF8 হওয়া কিছু মাইএসকিউএল শুধুমাত্র, 3-বাইট বৈকল্পিক আটকে আছে শুধুমাত্র মাইএসকিউএল (এবং MariaDB) কি না জানি যে। পৃথিবীর বাকি অংশগুলি ইউটিএফ 8 ব্যবহার করছে, এতে প্রতিটি চরিত্রে 4 টি বাইট থাকতে পারে । মাইএসকিউএল ডেভস তাদের হোমব্রিউ এনকোডিংয়ের ভুল নাম দিয়েছে utf8এবং পশ্চাদপটে সামঞ্জস্যতা না ভাঙতে, তাদের এখন সত্যিকারের ইউটিএফ 8 উল্লেখ করতে হবে utf8mb4
স্টিজন ডি উইট

162

আমি জানতে চেয়েছিলাম যে ব্যবহারের মধ্যে পারফরম্যান্সের পার্থক্য কী utf8_general_ciএবং utf8_unicode_ciআমি ইন্টারনেটে তালিকাভুক্ত কোনও মানদণ্ড খুঁজে পাইনি, তাই আমি নিজেই বেঞ্চমার্ক তৈরি করার সিদ্ধান্ত নিয়েছি।

আমি 500,000 সারি সহ একটি খুব সাধারণ টেবিল তৈরি করেছি:

CREATE TABLE test(
  ID INT(11) DEFAULT NULL,
  Description VARCHAR(20) DEFAULT NULL
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;

তারপরে আমি এই সঞ্চিত পদ্ধতিটি চালিয়ে এলোমেলো ডেটা দিয়ে পূর্ণ করেছি:

CREATE PROCEDURE randomizer()
BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE random CHAR(20) ;
  theloop: loop
    SET random = CONV(FLOOR(RAND() * 99999999999999), 20, 36);
    INSERT INTO test VALUES (i+1, random);
    SET i=i+1;
    IF i = 500000 THEN
      LEAVE theloop;
    END IF;
  END LOOP theloop;
END

তারপরে আমি নিম্নোক্ত সঞ্চিত প্রক্রিয়াগুলি সহজ SELECT, এর SELECTসাথে LIKEএবং বাছাইয়ের সাথে (এর SELECTমাধ্যমে ORDER BY) মাপদণ্ডের জন্য তৈরি করেছি :

CREATE PROCEDURE benchmark_simple_select()
BEGIN
  DECLARE i INT DEFAULT 0;
  theloop: loop
    SELECT *
    FROM test
    WHERE Description = 'test' COLLATE utf8_general_ci;
    SET i = i + 1;
    IF i = 30 THEN
      LEAVE theloop;
    END IF;
  END LOOP theloop;
END;

CREATE PROCEDURE benchmark_select_like()
BEGIN
  DECLARE i INT DEFAULT 0;
  theloop: loop
    SELECT *
    FROM test
    WHERE Description LIKE '%test' COLLATE utf8_general_ci;
    SET i = i + 1;
    IF i = 30 THEN
      LEAVE theloop;
    END IF;
  END LOOP theloop;
END;

CREATE PROCEDURE benchmark_order_by()
BEGIN
  DECLARE i INT DEFAULT 0;
  theloop: loop
    SELECT *
    FROM test
    WHERE ID > FLOOR(1 + RAND() * (400000 - 1))
    ORDER BY Description COLLATE utf8_general_ci LIMIT 1000;
    SET i = i + 1;
    IF i = 10 THEN
      LEAVE theloop;
    END IF;
  END LOOP theloop;
END;

উপরের সঞ্চিত পদ্ধতিতে utf8_general_ciকোলেশন ব্যবহৃত হয়, তবে অবশ্যই পরীক্ষার সময় আমি utf8_general_ciএবং উভয়ই ব্যবহার করি utf8_unicode_ci

আমি প্রতিটি সংগ্রহের জন্য প্রতিটি সঞ্চিত পদ্ধতি 5 বার কল করেছিলাম (5 বার utf8_general_ciএবং এর জন্য 5 বার utf8_unicode_ci) এবং তারপরে গড় মানগুলি গণনা করি calc

আমার ফলাফলগুলি হ'ল:

benchmark_simple_select()

  • সহ utf8_general_ci: 9,957 এমএস
  • সহ utf8_unicode_ci: 10,271 এমএস

এই বেঞ্চমার্কে ব্যবহারটি 3.2% এর utf8_unicode_ciচেয়ে ধীর utf8_general_ciহয়।

benchmark_select_like()

  • সাথে utf8_general_ci: 11,441 এমএস
  • সহ utf8_unicode_ci: 12,811 এমএস

এই মানদণ্ডে 12% এর utf8_unicode_ciচেয়ে ধীর গতিতে ব্যবহার করা হচ্ছে utf8_general_ci

benchmark_order_by()

  • সাথে utf8_general_ci: 11,944 এমএস
  • সহ utf8_unicode_ci: 12,887 এমএস

এই মানদণ্ডে 7.9% এর utf8_unicode_ciচেয়ে ধীর গতিতে ব্যবহার করা হচ্ছে utf8_general_ci


16
চমৎকার বেঞ্চমার্ক, ভাগ করে নেওয়ার জন্য ধন্যবাদ। আমি সংবেদনশীলভাবে অনুরূপ পরিসংখ্যান পাচ্ছি (উইন্ডোজে মাইএসকিউএল v5.6.12): 10%, 4%, 8%। আমি একমত: এর পারফরম্যান্স লাভটি utf8_general_ciব্যবহারের পক্ষে খুব কম ন্যূনতম।
র্যান্ডমসিড

10
1) তবে এই মানদণ্ডটি সংজ্ঞা অনুসারে দুটি কোলেশনের জন্য একইরকম ফলাফল তৈরি করে না? আমি বলতে চাইছি CONV(FLOOR(RAND() * 99999999999999), 20, 36)কেবলমাত্র ASCII তৈরি হয়েছে, এবং কোলিশনের অ্যালগরিদম দ্বারা কোনও ইউনিকোড অক্ষর প্রক্রিয়া করা যায় না। 2) Description = 'test' COLLATE ...এবং Description LIKE 'test%' COLLATE ...রানটাইমে কেবলমাত্র একটি একক স্ট্রিং ("পরীক্ষা") প্রক্রিয়া করে, তাই না? 3) আসল অ্যাপ্লিকেশনগুলিতে, ক্রম অনুসারে ব্যবহৃত কলামগুলি সম্ভবত ইনডেক্স করা হবে এবং বাস্তব অ-ASCII পাঠ্য সহ বিভিন্ন কোলেশনগুলিতে সূচকের গতি আলাদা হতে পারে।
হালিল üzgür

2
@ হালিলাজগের - আপনার বক্তব্য আংশিক ভুল। আমি অনুমান এটা কোডপয়েন্ট মান বাহিরে হওয়া ASCII (general_ci সঠিকভাবে হ্যান্ডেল করবে যা) হতে না, কিন্তু নির্দিষ্ট বৈশিষ্ট্য, হিসাবে "ইউএমএল লিখিত umlauts চিকিত্সা মত সম্পর্কে EA Ute" বা কিছু যেমন সুক্ষ্ণ বিষয়গুলো।
টমসজ গেন্ডার

38

এই পোস্টটি এটি খুব সুন্দরভাবে বর্ণনা করে।

সংক্ষেপে: utf8_unicode_ci ইউনিকোড মান হিসাবে সংজ্ঞায়িত হিসাবে ইউনিকোড কলেশন আলগোরিদিম ব্যবহার করে, যেখানে utf8_general_ci একটি আরও সাধারণ সাজানোর ক্রম যা "কম নির্ভুল" সাজানোর ফলাফলের ফলাফল করে।


1
ধন্যবাদ। এটা আমার ছাপ ছিল। আমি পারফরম্যান্সটি হিট করব :)
অনাসার

7
আপনি যদি নির্ভুলতার বিষয়ে চিন্তা করেন না, তবে যেকোন অ্যালগরিদমকে অসীম দ্রুত তৈরি করা তুচ্ছ। utf8_unicode_ciঅন্যটি ব্যবহার করুন এবং ভান করুন অন্যটি বিদ্যমান নেই।
tchrist

1
@ ক্রিশ্চর তবে আপনি যদি সঠিকতা এবং গতির মধ্যে একটি নির্দিষ্ট ভারসাম্য সম্পর্কে চিন্তা করেন তবে আপনার পক্ষে utf8_general_ciহতে পারে
শেলভাকু

@ ক্রিশ্চ কখনই গেম প্রোগ্রামার হয়ে উঠবেন না;)
স্টিজন ডি উইট

1
@ অনাসার - মাইএসকিউএল ৮.০ দাবি করে যে সমস্ত কোলেশনের পারফরম্যান্স উল্লেখযোগ্যভাবে উন্নত হয়েছে।
রিক জেমস

9

মাইএসকিএল ম্যানুয়াল, ইউনিকোড ক্যারেক্টার সেটস বিভাগটি দেখুন:

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

তাই সংক্ষেপ, utf_general_ci utf_unicode_ci চেয়ে তুলনা যা একটি ছোট এবং (আদর্শ অনুযায়ী) কম সঠিক সেট ব্যবহার করে উচিত সমগ্র মান বাস্তবায়ন। জেনারেল_সি সেটটি আরও দ্রুত হবে কারণ এর চেয়ে কম গণনা রয়েছে।


18
"কিছুটা কম সঠিক" বলে কোনও জিনিস নেই। সঠিকতা একটি বুলিয়ান বৈশিষ্ট্য; এটি ডিগ্রির পরিবর্তকগুলিকে স্বীকার করে না। কেবল utf8_unicode_ciবগি ভাঙা সংস্করণটি ব্যবহার করুন এবং ভান করুন।
tchrist

2
কোলেশন_সংযোগ সেটিংটি নেওয়ার জন্য আমার 5.6.15 পেতে সমস্যা হয়েছিল এবং এটি 'সেট নামগুলি utf8mb4 COLLATE utf8mb4_unicode_ci' এর মতো আপনাকে SET লাইনে পাস করতে হবে turns সমাধানের জন্য ক্রেডিট ম্যাথিয়াস ব্যেনেন্সকে যায়, এখানে তার খুব দরকারী গাইড: mathiasbynens.be/notes/mysql-utf8mb4
স্টিভ হিব্বার্ট

4
@ ট্রিচ্রিস্ট সঠিকতা বলার সমস্যাটি বুলিয়ান হ'ল এটি এমন পরিস্থিতিতে বিবেচনা করে না যেগুলি নিখুঁত নির্ভুলতার উপর নির্ভর করে না। আপনার অন্তর্নিহিত পয়েন্টটি অবৈধ নয় বা আমি জেনারেল_সি এর সুবিধাগুলি সমর্থন করার চেষ্টা করছি না, তবে নির্ভুলতা সম্পর্কে আপনার সাধারণ বক্তব্যটি সহজেই অস্বীকারযোগ্য। আমি আমার পেশায় এটি প্রতিদিনই করি। কমেডি একপাশে, স্টুয়ার্ট এখানে একটি ভাল পয়েন্ট আছে
অ্যান্টনি

5
ভূ-অবস্থান বা গেমের বিকাশের সাথে আমরা সার্বক্ষণিক পারফরম্যান্সের সাথে সঠিকতা বাণিজ্য করি correct এবং অবশ্যই নির্ভুলতা একটি বুল নয় 0এবং এর মধ্যে একটি আসল সংখ্যা 1। :) ইজি একটি বাউন্ডিং বাক্সে জিও পয়েন্ট নির্বাচন করে 'নিকটবর্তী পয়েন্টগুলি' এর একটি অনুমান যা বিন্দু এবং রেফারেন্স পয়েন্টের মধ্যে দূরত্ব গণনা করা এবং এটিতে ফিল্টারিংয়ের মতো ভাল নয়। তবে উভয়ই একটি আনুমানিক এবং সত্যিকার অর্থে সম্পূর্ণ নির্ভুলতা অর্জনযোগ্য নয়। দেখুন তটরেখা প্যারাডক্স এবং আইইইই 754
Stijn De Witt

4
টিএল; ডিআর : দয়া করে এমন একটি প্রোগ্রাম সরবরাহ করুন যা সঠিক ফলাফল মুদ্রণ করে1/3
স্টিজন ডি উইট

7

সংক্ষিপ্ত কথায়:

আপনার যদি আরও ভাল বাছাইয়ের অর্ডার প্রয়োজন হয় - ব্যবহার করুন utf8_unicode_ci(এটি পছন্দসই পদ্ধতি),

তবে আপনি যদি পারফরম্যান্সে পুরোপুরি আগ্রহী হন - ব্যবহার করুন utf8_general_ciতবে জেনে রাখুন এটি কিছুটা পুরানো।

পারফরম্যান্সের ক্ষেত্রে পার্থক্যগুলি খুব সামান্য।


1
দু'জনেই এখন পুরানো - আরও স্বীকৃত উত্তর দেখুন
থোমাসর্টটার

ঠিক আছে, আপনাকে ধন্যবাদ থমাস্রুটটার
সিমহোমিলিকো

6

কিছু বিশদ (পিএল)

যেহেতু আমরা এখানে ( পিটার গুলুতজান ) পড়তে পারি পোলিশ বর্ণ "Ł" বাছাই / তুলনা করার ক্ষেত্রে পার্থক্য রয়েছে (স্ট্রোক সহ এল - এইচটিএমএল Łএসসি:) (লোয়ার কেস: "ł" - এইচটিএমএল এসসি ł:) - আমাদের নিম্নলিখিত অনুমান রয়েছে:

utf8_polish_ci      Ł greater than L and less than M
utf8_unicode_ci     Ł greater than L and less than M
utf8_unicode_520_ci Ł equal to L
utf8_general_ci     Ł greater than Z

পোলিশ ভাষায় চিঠির Łপরে Lএবং তার আগে থাকে M। এই কোডিং এর কোনওটিই ভাল বা খারাপ নয় - এটি আপনার প্রয়োজনের উপর নির্ভর করে।


1

বাছাই এবং চরিত্রের মিল দুটি বড় পার্থক্য:

বাছাই করা হচ্ছে :

  • utf8mb4_general_ci সমস্ত অ্যাকসেন্টগুলি সরিয়ে দেয় এবং একে একে বাছাই করে যা ভুল সাজানোর ফলাফল তৈরি করতে পারে।
  • utf8mb4_unicode_ci সঠিক প্রকারের।

চরিত্রের মিল

তারা চরিত্রগুলি আলাদাভাবে মেলে।

উদাহরণস্বরূপ, আপনার মধ্যে utf8mb4_unicode_ciআছে i != ı, কিন্তু utf8mb4_general_ciএটি ধারণ করে ı=i

উদাহরণস্বরূপ, কল্পনা করুন যে আপনার সাথে একটি সারি রয়েছে name="Yılmaz"। তারপর

select id from users where name='Yilmaz';

যদি সংঘর্ষ হয় তবে সারিটি ফিরিয়ে দেবে utf8mb4_general_ci, তবে এটির সাথে সংঘবদ্ধ হলে সারিটি ফিরে utf8mb4_unicode_ciআসবে না !

অন্যদিকে আমরা যে আছে উপর a=ªএবং ß=ssমধ্যে utf8mb4_unicode_ciযা ঘটনা না utf8mb4_general_ci। তাই আপনি যদি সাথে মনোমালিন্য হয়েছে কল্পনা name="ªßi", তারপর

select id from users where name='assi';

সংঘর্ষ হলে সারিটি ফিরিয়ে দেবে utf8mb4_unicode_ci, তবে সংঘর্ষ সেট করা থাকলে একটি সারি ফেরত দেবে নাutf8mb4_general_ci

প্রতিটি সংঘর্ষের জন্য ম্যাচের একটি সম্পূর্ণ তালিকা এখানে পাওয়া যাবে


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