কোলেশনগুলির বেআইনী মিশ্রণ মাইএসকিউএল ত্রুটি


124

বিপুল সংখ্যক ডেটা প্রক্রিয়া করার সময় আমি এই অদ্ভুত ত্রুটিটি পাচ্ছি ...

Error Number: 1267

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

SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

এর সমাধানের জন্য আমি কী করতে পারি? আমি কীভাবে কোনওভাবে স্ট্রিংটি এড়াতে পারি যাতে এই ত্রুটিটি ঘটে না, বা আমার টেবিলের এনকোডিংটি কোনওভাবে পরিবর্তন করার দরকার আছে এবং যদি তাই হয় তবে আমি কী এটিকে পরিবর্তন করব?


এই ত্রুটি, এটি একটি ইনজেক্টেবল বা না?
হামজা ইরিজাজ 26'17

1
এটা কি তোমার প্রশ্নের উত্তর? মাইএসকিএল
ফারহান

উত্তর:


288
SET collation_connection = 'utf8_general_ci';

তারপরে আপনার ডাটাবেসের জন্য

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

মাইএসকিউএল কখনও কখনও কোনও বুদ্ধিমান কারণ ছাড়াই সেখানে সুইডিককে স্নেক করে।


3
@ বেন: সরাসরি অনুলিপি-পাস্তেবল সমাধানের জন্য আপনাকে ধন্যবাদ। আমাকে অনেক সময় বাঁচিয়েছে।
পিস্তোস


1
আমার কাছে প্রথম বিবৃতিটি করার অনুমতি ছিল না তবে এটি কেবল টেবিলটি করে কাজ করেছিল
রব সেডগুইক

আপনাকে এই জন্য ভালবাসা! : পি
প্রেথেকঠাল

দেখে মনে হচ্ছে এটি প্রচুর লোকের জন্য কাজ করে তবে দুর্ভাগ্যক্রমে এই থ্রেডটিতে সমস্ত ডিভাইস চেষ্টা করার পরেও আমার এই সমস্যাটি রয়েছে। আমার ডাটাবেস ডিফল্ট কোলিশন জেদীভাবে 'ucs2_bin' থেকে পরিবর্তন করতে অস্বীকার করেছে তাই এমনকি সমস্ত টেবিল এবং সংযোগ কোলেশনকে 'usc2_bin' এ পরিবর্তন করার চেষ্টা করেও আমি তবুও ত্রুটি পেয়েছি "এসকিউএল ত্রুটি (1267): কোলেশন অবৈধ মিশ্রণ (utf8_general_ci, IMPLICIT) এবং অপারেশন '=' "এর জন্য (ucs2_bin, IMPLICIT)।
বাইকম্যান 868

15

আপনি আপনার টেবিল এনকোডিং এবং সংযোগ এনকোডিং উভয় সেট করতে হবে UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

এবং

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';

এই দুটোই কি প্রয়োজনীয়, বা আমি কেবল তাদের মধ্যে একটি করতে পারি?
আপভোট ক্লিক করুন

ALTER ডেটাবেস myDbথেকে ডিফল্ট ক্যারেক্টার সেট UTF8 ক্রমসজ্জিত utf8_bin। কাজ করবে? এটি করা হয়েছে যাতে এটি আমার সমস্ত টেবিলগুলিকে প্রভাবিত করবে, কেবল তার মধ্যে একটিও নয়
আপভোট ক্লিক করুন

1
পরিবর্তে ডেটাবেস আপনার বর্তমান সারণী সেটিংস পরিবর্তন করবে না, শুধুমাত্র নতুন তৈরি করা। এটি ডাটাবেসের জন্যও ডিফল্ট চরসেট পরিবর্তন করতে ক্ষতি করবে না।
কাসনসুই

নাম সেট করুন এবং অক্ষর সেট আপনার সংযোগ এনকোডিং পরিবর্তন করবে। প্রতিবার আপনার সংযোগে আপনাকে এই আদেশগুলি জারি করা উচিত। আপনার ক্লায়েন্ট লাইব্রেরি এটি করার জন্য আরও মার্জিত পদ্ধতি সমর্থন করতে পারে (php :: mysqli does, php :: mysql does not)।
কাসনসুই

আপাতত কাজ করার জন্য মনে হচ্ছে, আমি আরও কিছু পরীক্ষার পরে গ্রহণ করব। দ্বিতীয় ক্যোয়ারীগুলি একবার চালানো দরকার, বা প্রতিটি স্ক্রিপ্টের শুরুতে?
উপভোটে ক্লিক করুন

13
CONVERT(column1 USING utf8)

আমার সমস্যা সমাধান করে যেখানে কলাম 1 হ'ল কলামটি যা আমাকে এই ত্রুটি দেয়।


আমার জন্য, এটি কাজ করেছে: কনভার্ট ("কলাম 1" ল্যাটিন 1 ব্যবহার করছে)
শশী কাঁথ

4

ত্রুটির জন্য নিম্নলিখিত বিবৃতি ব্যবহার করুন

ডেটা টেবিলের মধ্যে থাকলে আপনার ডেটা ব্যাকআপ নিতে সাবধান হন be

 আপনার টেবিল_নামেত্রে অক্ষরে অক্ষরে অক্ষরে অক্ষরে সেট করুন utf8 কল করুন utf8_ জেনারাল_সি;

2

সাধারণভাবে সবচেয়ে ভাল উপায় হ'ল টেবিলের জোট পরিবর্তন করা। তবে আমার একটি পুরানো অ্যাপ্লিকেশন রয়েছে এবং এর পার্শ্ব প্রতিক্রিয়া রয়েছে কিনা তা ফলাফলটি অনুমান করতে সত্যিই পারছি না। অতএব আমি কোনওভাবে চেষ্টা করেছি স্ট্রিংটিকে অন্য কোনও ফর্ম্যাটে রূপান্তর করার জন্য যা কোলেশন সমস্যার সমাধান করেছে। আমি যা কাজ করে দেখেছি তা হল স্ট্রিংগুলি এর অক্ষরগুলির একটি হেক্সাডেসিমাল উপস্থাপনায় রূপান্তর করে তুলনা করা। ডাটাবেসে HEX(column).পিএইচপি-র জন্য এটি করা হয় আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

public static function strToHex($string)
{
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}

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


2

আমি আমার টেবিলটি মূলত CHARSET = latin1 দিয়ে তৈরি করেছি । টেবিল রূপান্তরের পরে utf8 এ কয়েকটি কলাম রূপান্তরিত হয়নি, তবে এটি সত্যই স্পষ্ট ছিল না। আপনি চালানোর চেষ্টা করতে পারেন SHOW CREATE TABLE my_table;এবং দেখুন যে কোন কলামটি রূপান্তরিত হয়নি বা কেবল নীচের প্রশ্নের সাথে সমস্যাযুক্ত কলামে ভুল অক্ষর সেট করা হয়েছে (বর্ণের দৈর্ঘ্য পরিবর্তন করুন এবং আপনার প্রয়োজন অনুসারে CHARSET এবং COLLATE করুন):

 ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 
 COLLATE utf8_general_ci NULL;

2

টেবিলের অক্ষর সেটটি utf8 এ পরিবর্তন করুন

আপনার টেবিল_নাম অক্ষরে অক্ষরে সেট করুন utf8 টেবিল করুন


0

শীর্ষস্থানীয় উত্তরে আপনার সংশোধনগুলি তালিকাভুক্ত করার পরে, আপনার সার্ভারের ডিফল্ট সেটিংস পরিবর্তন করুন।

আপনার " /etc/my.cnf.d/server.cnf " এ বা যেখানে এটি অবস্থিত সেখানে [মাইএসকিএলডি] বিভাগে ডিফল্ট যুক্ত করুন যাতে এটি দেখতে এরকম দেখায়:

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

সূত্র: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html


0

আমি দেখতে পেয়েছি যে ব্যবহার cast()করা আমার পক্ষে সেরা সমাধান ছিল:

cast(Format(amount, "Standard") AS CHAR CHARACTER SET utf8) AS Amount

একটি convert()ফাংশনও আছে। এটা আরো বিস্তারিত এখানে

এখানে অন্য একটি সংস্থান


0

আমার ব্যবহারকারীর অ্যাকাউন্টে ডাটাবেস এবং টেবিল পরিবর্তন করার অনুমতি নেই, যেমন এই সমাধানে প্রস্তাবিত ।

যদি, আমার মতো, আপনি চরিত্রের জোটের বিষয়ে চিন্তা করেন না (আপনি '=' অপারেটর ব্যবহার করছেন), আপনি বিপরীত সংশোধন করতে পারেন। আপনার নির্বাচনের আগে এটি চালান:

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