মাইএসকিএলে "কোলিশনের অবৈধ মিশ্রণ" ত্রুটি সমস্যার সমাধান


210

মাইএসকিউএলে একটি সঞ্চিত পদ্ধতিতে একটি নির্বাচন করার চেষ্টা করার সময় নীচের ত্রুটিটি পাচ্ছি।

'=' অপারেশনের জন্য অবৈধ মিশ্রণ (ল্যাটিন 1_জেনারাল_সিএস, আইএমপিএলসিআইটি) এবং (ল্যাটিন 1_ জেনারাল_সি, আইএমপিএলসিআইটি)

এখানে ভুল হতে পারে সম্পর্কে কোন ধারণা?

টেবিলের কোলেশন হ'ল latin1_general_ciযেখানে ধারা রয়েছে তার কলামের latin1_general_cs


2
আমি একটি বৃহত্তর সময়কালের জন্য বিভিন্ন ডাটাবেস ব্যবহার করছি (১৯৯০ সাল থেকে), এবং এনওয়াইএসকিউএল দ্বারা তৈরি কোলিশন আনড কোর্সিবিটি ব্যবহার "পাগল" হিসাবে উপস্থিত, ডাটাবেসগুলি ডাটাবেসের জন্য "এক" অক্ষর সেট চাপিয়ে দেওয়ার সমস্যার সমাধান করে, তবে শেষ পর্যন্ত আমদানি / রফতানি পদ্ধতি থেকে / থেকে ডেটাবেস দ্বারা ব্যবহৃত অনন্য অক্ষর সেট রূপান্তর। মাইএসকিএল চয়েসেন সমাধানগুলি একটি ব্যাহতকারী, কারণ "অ্যাপ্লিকেশন সমস্যাগুলি" (চরিত্রের সেট রূপান্তর) এর সাথে ডেটাবেস ইস্যুতে মিশ্রণ করা হয় (সমষ্টি ব্যবহার)। ডাটাবেস থেকে সেই নির্বোধ এবং জটিল বৈশিষ্ট্যগুলিকে কেন "অপসারণ" করবেন না তাই এটি একটি দ্বারা আরও বেশি ব্যবহারযোগ্য এবং নিয়ন্ত্রণযোগ্য হয়ে যায়
মৌরিজিও পাইওয়াইলি

উত্তর:


216

এটি সাধারণত বেমানান কোলেশনের দুটি স্ট্রিংয়ের তুলনা করে বা বিভিন্ন কোলেশনের ডেটা একটি সম্মিলিত কলামে নির্বাচন করার চেষ্টা করার কারণে ঘটে থাকে।

ধারাটি COLLATEআপনাকে কোয়েরিতে ব্যবহৃত কোলেশন নির্দিষ্ট করার অনুমতি দেয়।

উদাহরণস্বরূপ, নীচের WHEREধারাটি সর্বদা আপনার পোস্ট করা ত্রুটিটি দেবে:

WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_cs

আপনার সমাধানটি ক্যোয়ারির মধ্যে দুটি কলামের জন্য একটি ভাগ করা কোলেশন নির্দিষ্ট করা। এখানে একটি উদাহরণ যা COLLATEদফাটি ব্যবহার করে :

SELECT * FROM table ORDER BY key COLLATE latin1_general_ci;

অপরটি BINARYঅপারেটরটি ব্যবহার করা :

বিনারি স্ট্রিং ক্যাস্টের জন্য সংক্ষিপ্ত হাত (স্ট্রাল AS বিনয়)।

আপনার সমাধানটি এর মতো দেখতে পারে:

SELECT * FROM table WHERE BINARY a = BINARY b;

বা,

SELECT * FROM table ORDER BY BINARY a;

2
ধন্যবাদ। আসলে এটি আমার ক্ষেত্রে বেশ অদ্ভুত আচরণ করছে বলে মনে হচ্ছে। আমি যখন ক্যোয়ারীটি ব্রাউজারের মাধ্যমে ক্যোয়ারীটি ঠিক তেমনভাবে চালিত করি তখন এটি আমার ফলাফলগুলি এনে দেয়। কিন্তু একটি সঞ্চিত পদ্ধতি ব্যবহার করে একটি ত্রুটি ছুঁড়ে ফেলা হয়।
ব্যবহারকারী 355562

5
বাইনারি আমার জন্য সেরা সমাধান বলে মনে হয়েছিল। আপনি যদি কোনও ছদ্মবেশী ফিল্টার ব্যবহার না করেন তবে এটি আপনার পক্ষে সেরাও হতে পারে।
আদম এফ

আমার একই সমস্যা আছে, আমি যেভাবে এই সমস্যাটি সমাধান করি তা প্রথম থেকেই পুনরায় তৈরি। আমি কোলেশন পরিবর্তন করার চেষ্টা করেছি কিন্তু আমি যখন যোগদান করি তখনও ত্রুটি ঘটেছিল, তাই আমি সেভাবে চেষ্টা করেছি। cmiiw
ববি জেড

দয়া করে মনে রাখবেন মারিয়াডিবিতে একটি ত্রুটি রয়েছে COLLATE latin1_general_ci যা ব্যবহার করে অন্য ত্রুটি ঘটে: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1''- এমনকি যদি আপনার অক্ষর সেট 'লাটিন 1' এর সাথে একটি কলাম না থাকে! সমাধানটি বিনের কাস্ট ব্যবহার করা। আরও দেখুন এই প্রশ্নের
Mel_T

154

টি এল; ডিআর

হয় স্ট্রিংগুলির মধ্যে একটি (বা উভয়) এর কোলেশন পরিবর্তন করুন যাতে তারা মেলে, বা অন্যথায় COLLATEআপনার অভিব্যক্তিতে একটি ধারা যুক্ত করুন ।


  1. যাইহোক এই "কোলেশন" স্টাফটি কী?

    সাধারণভাবে ক্যারেক্টার সেট এবং কোলেশনের অধীনে নথিভুক্ত হিসাবে :

    একটি অক্ষর সেট চিহ্ন এবং এনকোডিংগুলির একটি সেট a একটি কোলিশেশন একটি চরিত্রের সেটগুলিতে অক্ষরের তুলনা করার জন্য নিয়মের একটি সেট। আসুন একটি কাল্পনিক চরিত্র সেট একটি উদাহরণ সঙ্গে পার্থক্য পরিষ্কার করা যাক।

    মনে করুন আমাদের চারটি বর্ণ সহ একটি বর্ণমালা রয়েছে: " A", " B", " a", " b"। আমরা প্রতিটি অক্ষরকে একটি নম্বর দিয়ে থাকি: " A" = 0, " B" = 1, " a" = 2, " b" = 3। অক্ষর " A" একটি প্রতীক, 0 নম্বরটি " " এর জন্য এনকোডিংA এবং সমস্ত সংমিশ্রণ চারটি অক্ষর এবং তাদের এনকোডিংগুলি একটি চরিত্র সেট

    মনে করুন যে আমরা দুটি স্ট্রিং মান, " A" এবং " B" তুলনা করতে চাই । এটি করার সহজ উপায় হ'ল এনকোডিংগুলি: 0 " A" "এর জন্য এবং 1" B"" এর জন্য। 0 টি 1 এর চেয়ে কম, আমরা বলি " A" " " এর চেয়ে কম B"। আমরা সবেমাত্র যা করেছি তা হ'ল আমাদের অক্ষর সেটগুলিতে একটি কোলেশন প্রয়োগ করা। কোলেশন হ'ল নিয়মের একটি সেট (এই ক্ষেত্রে কেবলমাত্র একটি নিয়ম): "এনকোডিংগুলি তুলনা করুন।" আমরা সম্ভাব্য সমস্ত কল্যানেশনের এই সর্বাধিক সহজটিকে বাইনারি কোলেশন বলি ।

    তবে আমরা যদি ছোট ছোট এবং বড় হাতের অক্ষরের সমতুল্য বলতে চাই? তারপর আমরা অন্তত দুই নিয়ম হবে: (1) ছোট হাতের অক্ষর "আচরণ a" এবং " b" সমতুল্য হিসাবে " A" এবং " B"; (২) তারপরে এনকোডিংগুলি তুলনা করুন। আমরা একে কেস-সংবেদনশীল কোলেশন বলি । এটি বাইনারি কোলেশন থেকে কিছুটা জটিল।

    বাস্তব জীবনে, বেশিরভাগ চরিত্রের সেটগুলিতে অনেকগুলি অক্ষর থাকে: কেবলমাত্র " A" এবং " B" নয় পুরো পুরো বর্ণমালা, কখনও কখনও একাধিক বর্ণমালা বা হাজারে অক্ষর সহ পূর্বের লেখার ব্যবস্থা, সাথে আরও অনেক বিশেষ চিহ্ন এবং বিরাম চিহ্ন রয়েছে। বাস্তব জীবনেও, বেশিরভাগ কোলিশনের অনেকগুলি বিধি রয়েছে, কেবলমাত্র লেটারকেস আলাদা করতে হবে তা নয়, তবে উচ্চারণগুলিও আলাদা করা উচিত কিনা ("" উচ্চারণ "এটি জার্মান" Ö"এর মতো একটি চরিত্রের সাথে সংযুক্ত একটি চিহ্ন ) এবং একাধিক-চরিত্রের জন্য ম্যাপিংস (যেমন দুটি জার্মান কোলেশনগুলির মধ্যে একটিতে " Ö" = " OE" নিয়ম )

    আরও উদাহরণগুলি মিলনের প্রভাবের উদাহরণগুলির অধীনে দেওয়া হয়েছে ।

  2. ঠিক আছে, তবে মাইএসকিউএল কোনও প্রদত্ত এক্সপ্রেশনটির জন্য কোন কোলেশন ব্যবহার করবেন তা কীভাবে সিদ্ধান্ত নেবে?

    প্রকাশের সমাহার অনুসারে নথিভুক্ত :

    প্রচুর বিবৃতিতে, এটি তুলনামূলক ক্রিয়াকলাপটি সমাধান করার জন্য মাইএসকিউএল কী জোট ব্যবহার করে তা স্পষ্ট। উদাহরণস্বরূপ, নিম্নলিখিত ক্ষেত্রে, এটি পরিষ্কার হওয়া উচিত যে কোলেশনটি কলামের সমাহার charset_name:

    SELECT x FROM T ORDER BY x;
    SELECT x FROM T WHERE x = x;
    SELECT DISTINCT x FROM T;

    তবে একাধিক অপারেশনের সাথে দ্বিপাক্ষিকতা থাকতে পারে। উদাহরণ স্বরূপ:

    SELECT x FROM T WHERE x = 'Y';

    তুলনাটি কি কলামের কোলেশন ব্যবহার করতে হবে x, বা স্ট্রিংকে আক্ষরিক ব্যবহার করতে হবে 'Y'? উভয় xএবং 'Y'সমষ্টি আছে, তাই কোন কোলেশন অগ্রাধিকার নেয়?

    স্ট্যান্ডার্ড এসকিউএল "কোর্সিটিিবিলিটি" বিধি হিসাবে পরিচিত যা ব্যবহার করে এই জাতীয় প্রশ্নগুলির সমাধান করে।

    [ মুছে ফেলা ]

    মাইএসকিউএল অস্পষ্টতাগুলি সমাধান করার জন্য নিম্নলিখিত নিয়মগুলির সাথে সহকর্মীতা মানগুলি ব্যবহার করে:

    • সর্বনিম্ন সহকরের মান সহ কোলেশন ব্যবহার করুন।

    • উভয় পক্ষের যদি একই সমষ্টি হয়, তবে:

      • উভয় পক্ষের ইউনিকোড হয়, বা উভয় পক্ষের ইউনিকোড না থাকলে এটি একটি ত্রুটি।

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

        SELECT CONCAT(utf8_column, latin1_column) FROM t1;

        এটি এমন একটি ফলাফল প্রদান করে যার একটি অক্ষর সেট আছে utf8এবং একই সমষ্টি রয়েছে utf8_column। মান যুক্ত হওয়ার আগে মানগুলি latin1_columnস্বয়ংক্রিয়ভাবে রূপান্তরিত utf8হয়।

      • একই অক্ষর সেট থেকে অপারেন্ডগুলির সাথে একটি ক্রিয়াকলাপের জন্য তবে এটি একটি _binকোলেশন এবং একটি _ciবা _csকোলেশন মিশ্রিত করে , _binকোলেশন ব্যবহৃত হয়। এটি ননবাইনারি এবং বাইনারি স্ট্রিংগুলিকে মিশ্রণকারী অপারেশনগুলিকে বাইনারি স্ট্রিং হিসাবে অপারেশনগুলিকে কীভাবে মূল্যায়িত করে তার সাথে এটি একই রকম, কেবলমাত্র এটি ডেটা ধরণের পরিবর্তে কোলেশনগুলির জন্য।

  3. সুতরাং একটি "অবৈধ মিশ্রণ" কী?

    একটি "অবৈধ মিশ্রণ" ঘটে যখন একটি অভিব্যক্তি বিভিন্ন কোলিশের দুটি স্ট্রিংয়ের সাথে তুলনা করে তবে সমান সহ্যযোগ্যতা এবং সহজাতকরণের নিয়মগুলি বিরোধ নিষ্পত্তি করতে সহায়তা করতে পারে না। এটি উপরের উদ্ধৃতিতে তৃতীয় বুলেট-পয়েন্টের আওতায় বর্ণিত পরিস্থিতি।

    প্রশ্নটিতে প্রদত্ত বিশেষ ত্রুটিটি Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '='আমাদেরকে বলে যে সমান সমবায়তার দুটি নন-ইউনিকোড স্ট্রিংয়ের মধ্যে একটি সমতা তুলনা ছিল। এটি আরও আমাদের জানায় যে সমষ্টিগুলি বিবৃতিতে সুস্পষ্টভাবে দেওয়া হয়নি বরং তারগুলি উত্স (যেমন কলাম মেটাডেটা) থেকে অন্তর্ভুক্ত ছিল।

  4. এগুলি সব খুব ভাল, তবে কীভাবে এইরকম ত্রুটিগুলি সমাধান করা যায়?

    উপরে উল্লিখিত ম্যানুয়াল এক্সট্র্যাক্টগুলি যেমন পরামর্শ দেয়, এই সমস্যাটি বেশ কয়েকটি উপায়ে সমাধান করা যেতে পারে, যার মধ্যে দুটি বুদ্ধিমান এবং সুপারিশ করার জন্য:

    • স্ট্রিংগুলির মধ্যে একটি (বা উভয়) এর কোলেশন পরিবর্তন করুন যাতে তারা মেলে এবং আর কোনও অস্পষ্টতা নেই।

      এটি কীভাবে করা যায় তার উপর নির্ভর করে স্ট্রিংটি কোথা থেকে এসেছে: আক্ষরিক এক্সপ্রেশন collation_connectionসিস্টেম ভেরিয়েবলের মধ্যে উল্লিখিত কোলেশন গ্রহণ করে ; সারণী থেকে মানগুলি তাদের কলাম মেটাডেটাতে উল্লিখিত কোলেশন গ্রহণ করে।

    • একটি স্ট্রিং জোর করে না জোর করা Force

      আমি উপরের থেকে নীচের উদ্ধৃতিটি বাদ দিয়েছি:

      মাইএসকিউএল নিম্নরূপ সহারযোগ্যতা মান নির্ধারণ করে:

      • একটি সুস্পষ্ট COLLATEধারাটিতে 0. এর সহজাততা রয়েছে (মোটেই সহকীয় নয়))

      • বিভিন্ন জোটের সাথে দুটি স্ট্রিংয়ের সংক্ষিপ্তকরণের 1 এর সহকর্মিতা রয়েছে।

      • একটি কলাম বা একটি সঞ্চিত রুটিন প্যারামিটার বা স্থানীয় ভেরিয়েবলের কোলেশন 2 এর সহকর্মিতা রয়েছে।

      • একটি "সিস্টেম ধ্রুবক" (স্ট্রিং যেমন ফাংশন দ্বারা ফিরে USER()বা VERSION()) 3 একটি coercibility হয়েছে।

      • আক্ষরিক মিলনের 4 টির একটি সহকর্মিতা রয়েছে।

      • NULLবা একটি অভিব্যক্তি যা NULLউত্পন্ন হয়েছে এর 5 এর সহকীয়তা রয়েছে।

      সুতরাং COLLATEতুলনায় ব্যবহৃত স্ট্রিংগুলির মধ্যে একটিতে কেবল একটি ধারা যুক্ত করা সেই কোলেশনটির ব্যবহারকে বাধ্য করবে।

    অন্যরা যদি কেবল এই ত্রুটিটি সমাধান করার জন্য মোতায়েন করা হয় তবে তাদের পক্ষে অত্যন্ত খারাপ অভ্যাস হবে:

    • স্ট্রিংগুলির একটি (বা উভয়) কে অন্য কিছু সহীকরণের মান থাকতে বাধ্য করুন যাতে একটি অগ্রাধিকার গ্রহণ করে।

      এর ব্যবহার CONCAT()বা এর CONCAT_WS()ফলাফল 1 এর সহকতা সহ একটি স্ট্রিং; এবং (যদি কোনও সঞ্চিত রুটিনে থাকে) প্যারামিটার / স্থানীয় ভেরিয়েবলগুলির ব্যবহারের ফলে 2 এর একটি সহজাতকরণের সাথে স্ট্রিং আসে।

    • স্ট্রিংগুলির একটি (বা উভয়) এর এনকোডিংগুলি পরিবর্তন করুন যাতে একটি ইউনিকোড এবং অন্যটি না থাকে।

      এটি ট্রান্সকোডিংয়ের মাধ্যমে করা যেতে পারে ; বা উপাত্তের অন্তর্নিহিত অক্ষর সেট পরিবর্তনের মাধ্যমে (যেমন কলাম পরিবর্তন করা, আক্ষরিক মানগুলির জন্য পরিবর্তন করা, বা ক্লায়েন্টের কাছ থেকে তাদের অন্য কোনও এনকোডিংয়ে পাঠানো এবং একটি অক্ষর সেট পরিচিতি পরিবর্তন / যুক্ত করা)। নোট করুন যে কিছু পছন্দসই অক্ষর নতুন অক্ষর সেটটিতে এনকোড করা না গেলে এনকোডিং পরিবর্তন করা অন্যান্য সমস্যার কারণ হতে পারে।CONVERT(expr USING transcoding_name)character_set_connectioncharacter_set_client

    • স্ট্রিংগুলির একটি (বা উভয়) এর এনকোডিংগুলি পরিবর্তন করুন যাতে সেগুলি উভয় একই হয় এবং প্রাসঙ্গিক _binকোলেশন ব্যবহার করতে একটি স্ট্রিং পরিবর্তন করুন ।

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


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

5
দুর্দান্ত উত্তর। এটি একটিকে আরও বাড়ানো উচিত, কারণ এটি বিকাশকারীদের সত্যিকারের কী জানা উচিত তাতে ডুব দেয়; কীভাবে এটি ঠিক করা যায় তা নয়, তবে ঘটনাগুলি কেন ঘটছে তা সত্যিই বুঝতে পারবেন;
চিহ্নিত করুন

থ্যাঙ্কস দোস্ত, আজ তুমি আমাকে কিছু শিখিয়েছ।
ব্রিঙ্কিপ

66

ভবিষ্যতের গুগলদের জন্য আলোচনায় আমার 2 সি যোগ করা।

আমি একটি অনুরূপ সমস্যা তদন্ত করছিলাম যেখানে ভার্চর প্যারামিটারটি প্রাপ্ত কাস্টম ফাংশনগুলি ব্যবহার করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি :

Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and 
(utf8_general_ci,IMPLICIT) for operation '='

নিম্নলিখিত কোয়েরি ব্যবহার:

mysql> show variables like "collation_database";
    +--------------------+-----------------+
    | Variable_name      | Value           |
    +--------------------+-----------------+
    | collation_database | utf8_general_ci |
    +--------------------+-----------------+

আমি বলতে সক্ষম হয়েছি যে ডিবি utf8_general_ci ব্যবহার করছে , যখন টেবিলগুলি utf8_unicode_ci ব্যবহার করে সংজ্ঞায়িত করা হয়েছিল :

mysql> show table status;
    +--------------+-----------------+
    | Name         | Collation       |
    +--------------+-----------------+
    | my_view      | NULL            |
    | my_table     | utf8_unicode_ci |
    ...

লক্ষ্য করুন যে ভিউগুলিতে নুল সমষ্টি রয়েছে। দেখা যাচ্ছে যে ভিউ এবং ফাংশনগুলির কোলেশন সংজ্ঞা রয়েছে যদিও এই কোয়েরিটি একটি দর্শনকে বাতিল করে দেয়। ব্যবহৃত কোলেশনটি হ'ল ডিবি কোলেশন যা ভিউ / ফাংশন তৈরি হওয়ার সময় সংজ্ঞায়িত করা হয়েছিল।

দু: খজনক সমাধান হ'ল উভয়ই ডিবি কোলেশন পরিবর্তন করা এবং বর্তমান সংকলনটি ব্যবহার করতে বাধ্য করার জন্য মতামত / ক্রিয়াকলাপগুলি পুনরায় তৈরি করা।

  • ডিবির কোলেশন পরিবর্তন করা হচ্ছে:

    ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;
  • টেবিলের কোলেশন পরিবর্তন করা হচ্ছে:

    ALTER TABLE mydb CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

আমি আশা করি এটি কারও সাহায্য করবে।


12
কোলেশনটি কলাম স্তরেও সেট করা যেতে পারে। আপনি এটির সাথে এটি দেখতে পারেন:show full columns from my_table;
জোনাথন ট্রান

ধন্যবাদ. আমি কেবল স্কিমাটি বাদ দিয়েছি এবং এটি সঠিক ডিফল্ট কোলেশন দিয়ে পুনরায় তৈরি করেছি এবং সবকিছু পুনরায় আমদানি করেছি।
জেআরুন

1
@ জোনাথন ট্রান আপনাকে ধন্যবাদ! আমার সমস্ত টেবিল, ডাটাবেস এবং সংযোগে চরিত্র সেট এবং কোলিশন সেট ছিল তবে এটি এখনও ত্রুটি দিচ্ছিল! কোলেশন কোনও কলামে সেট করা হয়নি! আমি এটি দিয়ে ঠিক করেছিalter table <TABLE> modify column <COL> varchar(255) collate utf8_general_ci;
ক্লো

2
ভবিষ্যতের গুগলদের জন্য সিডিনোট: এমনকি আপনার ডেটাবেস, টেবিল এবং ক্ষেত্রগুলির একই মিলন থাকলেও আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার সংযোগটি একই কোলেশন ব্যবহার করছে। সব কিছুর »utf8mb4_unicode_ci has আছে তবে SHOW session variables like '%collation%';আপনাকে বলে যে» কোলেশন_সংযোগ «» utf8mb4_ জেনারাল_সি «? তারপরে SET collation_connection = utf8mb4_unicode_ciআগে চালান ।
পিক্সেলব্রিকেট

ধন্যবাদ! এটি ট্র্যাক করতে আমাকে কিছুক্ষণ সময় নিয়েছে। টেবিলগুলি কেবল একই সমান্তরাল হতে হবে না, তবে ডিবিও করে!
মোটো

15

কখনও কখনও চরসেটগুলি রূপান্তর করা বিপজ্জনক হতে পারে, বিশেষত বিপুল পরিমাণে ডেটাবেসগুলিতে। আমি মনে করি সেরা বিকল্পটি হ'ল "বাইনারি" অপারেটরটি ব্যবহার করা:

e.g : WHERE binary table1.column1 = binary table2.column1

10

আমারও একই সমস্যা ছিল, স্ট্রিং ভেরিয়েবলের সাথে FIND_IN_SET পদ্ধতিটি ব্যবহার করার চেষ্টা করছিলাম ।

SET @my_var = 'string1,string2';
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);

এবং ত্রুটিটি পেয়েছিল

ত্রুটি কোড: 1267. অবধি 'find_in_set' অপারেশনের জন্য অবৈধ মিশ্রণ (utf8_unicode_ci, IMPLICIT) এবং (utf8_general_ci, IMPLICIT) অবৈধ মিশ্রণ

সংক্ষিপ্ত উত্তর:

কোনও কোলেশন_ YYYY ভেরিয়েবল পরিবর্তন করার দরকার নেই, কেবল আপনার ভেরিয়েবল ঘোষণার পাশের সঠিক কোলেশন যুক্ত করুন , অর্থাৎ

SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);

দীর্ঘ উত্তর:

আমি প্রথমে কোলেশন ভেরিয়েবলগুলি পরীক্ষা করেছিলাম:

mysql> SHOW VARIABLES LIKE 'collation%';
    +----------------------+-----------------+
    | Variable_name        | Value           |
    +----------------------+-----------------+
    | collation_connection | utf8_general_ci |
    +----------------------+-----------------+
    | collation_database   | utf8_general_ci |
    +----------------------+-----------------+
    | collation_server     | utf8_general_ci |
    +----------------------+-----------------+

তারপরে আমি টেবিলের জোটটি পরীক্ষা করেছিলাম:

mysql> SHOW CREATE TABLE my_table;

CREATE TABLE `my_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `column_name` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=125 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

এর অর্থ এই যে আমার টেবিলটি utf8_unicode_ci হিসাবে কনফিগার করা অবস্থায় আমার চলকটি utf8_general_ci এর ডিফল্ট সমাহার দিয়ে কনফিগার করা হয়েছিল

ভেরিয়েবল ঘোষণার পাশের COLLATE কমান্ড যুক্ত করে, ভেরিয়েবল কোলেশনটি টেবিলের জন্য কনফিগার করা জোটের সাথে মেলে।


5

আপনি এই স্ক্রিপ্টটি চেষ্টা করতে পারেন , এটি আপনার সমস্ত ডাটাবেস এবং টেবিলগুলিকে utf8 তে রূপান্তর করে।


1
লাইন 24 "কার্সর" এর পরিবর্তে "কার"
RTOSkit

2
এবং কিছু সূচকের আকার ত্রিগুণ করে।
দামিয়ান ইয়ারিক

2

আক্ষরিক জড়িত থাকলে সমাধান।

আমি পেন্টাহো ডেটা ইন্টিগ্রেশন ব্যবহার করছি এবং এসকিউএল সিনট্যাক্স নির্দিষ্ট করতে পাই না। খুব সাধারণ ডিবি লুকআপ ব্যবহার করে "= 'অপারেশনের জন্য" অবৈধ মিশ্রণগুলির (সিপি 850_ জেনারাল_সি, কর্সিবল) এবং (ল্যাটিন 1_সুইডিশ_সি, কর্সিল) ত্রুটিটি দেওয়া হয়েছে ""

উত্পন্ন কোডটি ছিল "নির্বাচিত ডেটা_ডিজাইটি হিসাবে সর্বশেষ_ডাটা_ইডি থেকে hr_cc_normalised_data_date_v পিএসইউডো_কেই = কোথায়?"

গল্পটি সংক্ষিপ্তভাবে কাটা দেখার জন্য দেখার ছিল এবং আমি যখন জারি করেছি

mysql> show full columns from hr_cc_normalised_data_date_v;
+------------+------------+-------------------+------+-----+
| Field      | Type       | Collation         | Null | Key |
+------------+------------+-------------------+------+-----+
| PSEUDO_KEY | varchar(1) | cp850_general_ci  | NO   |     |
| DATA_DATE  | varchar(8) | latin1_general_cs | YES  |     |
+------------+------------+-------------------+------+-----+

যা 'সিপি 850_ জেনারাল_সিআই' কোথা থেকে এসেছে তা ব্যাখ্যা করে।

ভিউটি কেবল 'নির্বাচন' এক্স 'দিয়ে তৈরি করা হয়েছিল, ......' ম্যানুয়াল আক্ষরিক অনুসারে এর অক্ষর সেট এবং সার্ভার সেটিংস থেকে সংগৃহীত হওয়া উচিত যা সঠিকভাবে 'latin1' এবং 'latin1_general_cs' হিসাবে সংজ্ঞায়িত করা হয়েছিল স্পষ্টভাবে ঘটেছিল না আমি এটিকে জোর করে দেখেছি creation

CREATE OR REPLACE VIEW hr_cc_normalised_data_date_v AS
SELECT convert('X' using latin1) COLLATE latin1_general_cs        AS PSEUDO_KEY
    ,  DATA_DATE
FROM HR_COSTCENTRE_NORMALISED_mV
LIMIT 1;

এখন এটি উভয় কলামের জন্য ল্যাটিন 1_ জেনারাল_সিএস দেখায় এবং ত্রুটিটি চলে গেছে। :)


1

মাইএসকিউএল মেশানো মেশানোগুলি সত্যিই অপছন্দ করে যদি না এটি তাদেরকে একই জোর করে জোর করে তোলে (যা আপনার ক্ষেত্রে স্পষ্টভাবে সম্ভব নয়)। আপনি কি একই কলশনকে একটি বাধ্যতামূলক ধারা হিসাবে ব্যবহার করতে বাধ্য করতে পারবেন না ? (বা BINARYপ্রযোজ্য হলে সহজ শর্টকাট ...)।


এটি কি মাইএসকিউএল এর কাছে অনন্য? অন্যান্য সিস্টেমগুলি আপাতদৃষ্টিতে সমান অগ্রাধিকারের অসঙ্গতিপূর্ণ জোটের মিশ্রণটি কীভাবে পরিচালনা করবে?
উদ্বিগ্ন

আপনার লিঙ্কটি বৈধ নয়।
বেনুবার্ড

1

আপনার যে কলামগুলির সাথে সমস্যা হচ্ছে সেগুলি যদি "হ্যাশ" হয় তবে নিম্নলিখিতগুলি বিবেচনা করুন ...

"হ্যাশ" যদি বাইনারি স্ট্রিং হয় তবে আপনার ব্যবহার করা উচিত BINARY(...) ডেটাটাইপ ।

যদি "হ্যাশ" হেক্স স্ট্রিং হয় তবে আপনাকে ইউটিএফ 8 লাগবে না এবং চরিত্রের চেক ইত্যাদির কারণে এড়ানো উচিত example উদাহরণস্বরূপ, মাইএসকিউএলের MD5(...)একটি নির্দিষ্ট দৈর্ঘ্যের 32-বাইট হেক্স স্ট্রিং পাওয়া যায়। SHA1(...)একটি 40-বাইট হেক্স স্ট্রিং দেয়। এটিতে সংরক্ষণ করা যেতে পারেCHAR(32) CHARACTER SET ascii (অথবা sha1 এর জন্য 40) এ ।

অথবা, এখনো ভালো, সংরক্ষণ UNHEX(MD5(...))মধ্যে BINARY(16)। এটি কলামের অর্ধেক আকারে কেটে দেয়। (এটি এটি বরং অপ্রিনিতযোগ্য করে তোলে)) SELECT HEX(hash) ... যদি আপনি এটি পঠনযোগ্য চান।

দুটি BINARYকলামের তুলনা করার কোনও কোলেশন সমস্যা নেই।


1

খুব আকর্ষণীয় ... এখন, প্রস্তুত। আমি "অ্যাড কোলেট" সমাধানগুলির সমস্তটির দিকে তাকিয়েছিলাম এবং আমার কাছে, সেগুলি ব্যান্ড এইড ফিক্স। বাস্তবতা হ'ল ডাটাবেস ডিজাইনটি ছিল "খারাপ"। হ্যাঁ, স্ট্যান্ডার্ড পরিবর্তন এবং নতুন জিনিস যুক্ত হয়, ভাল, তবে এটি খারাপ ডাটাবেস ডিজাইনের সত্যকে পরিবর্তন করে না। আমি শুধু আমার জিজ্ঞাসাটি কাজ করতে পেতে সমস্ত এসকিউএল বিবৃতি জুড়ে "কোলেট" যুক্ত করার পথে যেতে অস্বীকার করি। আমার জন্য একমাত্র সমাধান যা কাজ করে এবং ভবিষ্যতে আমার কোডটি টুইট করার প্রয়োজনটিকে কার্যত দূর করে দেয় তা হল আমি দীর্ঘমেয়াদী ভবিষ্যতের সাথে যে লাইফের সাথে বাস করব এবং আলিঙ্গন করব সেই চরিত্রের সাথে মেলে ডেটাবেস / টেবিলগুলি পুনরায় ডিজাইন করা। এই ক্ষেত্রে, আমি " utf8mb4 " অক্ষর সেট নিয়ে যেতে পছন্দ করি ।

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

আপনাকে নির্দেশ দেওয়ার জন্য এই আদেশগুলি ব্যবহার করুন:

SHOW VARIABLES LIKE "collation_database";
SHOW TABLE STATUS;

এখন, আপনি যদি এখানে এবং সেখানে "কোলেট" যুক্ত করতে উপভোগ করেন এবং ফোর্স "ওভাররাইড" পূর্ণ করে আপনার কোডটি গোছাচ্ছেন, আমার অনুমান করুন।



0

সমাহারগুলির সাথে ইস্যুটির আরেকটি উত্স হ'ল mysql.procটেবিল। আপনার স্টোরেজ পদ্ধতি এবং ক্রিয়াকলাপগুলির কোলেশনগুলি পরীক্ষা করুন:

SELECT
  p.db, p.db_collation, p.type, COUNT(*) cnt
FROM mysql.proc p
GROUP BY p.db, p.db_collation, p.type;

কলাম mysql.proc.collation_connectionএবং মনোযোগ দিন mysql.proc.character_set_client


0

আপনার যদি পিএইচপিএমআইএডমিন ইনস্টল থাকে তবে আপনি নীচের লিঙ্কে প্রদত্ত নির্দেশাবলীটি অনুসরণ করতে পারেন: https://ediample.net/commune/products/dv/204403914/default-mysql-character-set-and-collation আপনাকে কোলেটের সাথে মিল রাখতে হবে সমস্ত টেবিলের সাথে ডাটাবেসের পাশাপাশি টেবিলের ক্ষেত্রগুলি এবং তারপরে সমস্ত সঞ্চিত পদ্ধতি এবং ফাংশন পুনরায় সংকলন করুন। সেই সাথে সবকিছু আবার কাজ করা উচিত।


-1

আমি ব্যবহার করেছি ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;, কিন্তু কাজ করিনি।

এই ক্যোয়ারিতে:

Select * from table1, table2 where table1.field = date_format(table2.field,'%H');

এই কাজটি আমার জন্য:

Select * from table1, table2 where concat(table1.field) = date_format(table2.field,'%H');

হ্যাঁ, কেবল ক concat


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

ALL DATABASE mydb DEFULT COLLATE ... আমার জন্য কাজ করেছে, তাই upvote। ডাটাবেসটি ড্রপ এবং পুনরায় তৈরি করতে এবং ব্যাকআপগুলি থেকে লোড করতে পারার পরে আমার একটি সুবিধা ছিল।
tobixen

-2

এই কোডটি ডেটাবেজে রান এসকিউএল ক্যোয়ারী / কোয়েরিগুলির মধ্যে রাখা দরকার

এসকিউএল QUERY উইন্ডো

ALTER TABLE `table_name` CHANGE `column_name` `column_name`   VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL;

উপযুক্ত নাম সহ টেবিলের নাম এবং কলাম_নামটি প্রতিস্থাপন করুন।

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