'=' অপারেশনের জন্য অবৈধ মিশ্রণ (utf8_unicode_ci, IMPLICIT) এবং (utf8_general_ci, IMPLICIT) অবৈধ মিশ্রণ


160

মাইএসকিএলে ত্রুটি বার্তা:

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

আমি অন্যান্য বেশ কয়েকটি পোস্ট দিয়ে গিয়েছি এবং এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি। ক্ষতিগ্রস্থ অংশটি এর অনুরূপ:

CREATE TABLE users (
    userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    firstName VARCHAR(24) NOT NULL,
    lastName VARCHAR(24) NOT NULL,
    username VARCHAR(24) NOT NULL,
    password VARCHAR(40) NOT NULL,
    PRIMARY KEY (userid)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;

CREATE TABLE products (
    productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    title VARCHAR(104) NOT NULL,
    picturePath VARCHAR(104) NULL,
    pictureThumb VARCHAR(104) NULL,
    creationDate DATE NOT NULL,
    closeDate DATE NULL,
    deleteDate DATE NULL,
    varPath VARCHAR(104) NULL,
    isPublic TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
    PRIMARY KEY (productID)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;

CREATE TABLE productUsers (
    productID INT UNSIGNED NOT NULL,
    userID INT UNSIGNED NOT NULL,
    permission VARCHAR(16) NOT NULL,
    PRIMARY KEY (productID,userID),
    FOREIGN KEY (productID) REFERENCES products (productID) ON DELETE RESTRICT ON UPDATE NO ACTION,
    FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE RESTRICT ON UPDATE NO ACTION
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;

আমি যে স্টোরেজ পদ্ধতিটি ব্যবহার করছি তা হ'ল:

CREATE PROCEDURE updateProductUsers (IN rUsername VARCHAR(24),IN rProductID INT UNSIGNED,IN rPerm VARCHAR(16))
BEGIN
    UPDATE productUsers
        INNER JOIN users
        ON productUsers.userID = users.userID
        SET productUsers.permission = rPerm
        WHERE users.username = rUsername
        AND productUsers.productID = rProductID;
END

আমি পিএইচপি দিয়ে পরীক্ষা করছিলাম তবে এসকিউএলওগের সাথে একই ত্রুটি দেওয়া হয়েছে। আমি পুরো ডিবি পুনরুদ্ধার পরীক্ষাও করেছি তবে ভাল হয়নি।

যে কোন সাহায্যের জন্য অনেক প্রশংসা করা হবে।

উত্তর:


220

সঞ্চিত প্রক্রিয়া পরামিতিগুলির জন্য ডিফল্ট কোলেশন হ'ল utf8_general_ciএবং আপনি কলিশগুলি মিক্স করতে পারবেন না, সুতরাং আপনার কাছে চারটি বিকল্প রয়েছে:

বিকল্প 1 : COLLATEআপনার ইনপুট ভেরিয়েবলে যুক্ত করুন:

SET @rUsername = aname COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);

অপশন 2 : অ্যাড COLLATEকরতে WHEREদফা:

CREATE PROCEDURE updateProductUsers(
    IN rUsername VARCHAR(24),
    IN rProductID INT UNSIGNED,
    IN rPerm VARCHAR(16))
BEGIN
    UPDATE productUsers
        INNER JOIN users
        ON productUsers.userID = users.userID
        SET productUsers.permission = rPerm
        WHERE users.username = rUsername COLLATE utf8_unicode_ci -- COLLATE added
        AND productUsers.productID = rProductID;
END

বিকল্প 3 : এটি INপ্যারামিটার সংজ্ঞায় যুক্ত করুন:

CREATE PROCEDURE updateProductUsers(
    IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, -- COLLATE added
    IN rProductID INT UNSIGNED,
    IN rPerm VARCHAR(16))
BEGIN
    UPDATE productUsers
        INNER JOIN users
        ON productUsers.userID = users.userID
        SET productUsers.permission = rPerm
        WHERE users.username = rUsername
        AND productUsers.productID = rProductID;
END

বিকল্প 4 : ক্ষেত্রটি নিজেই পরিবর্তন করুন:

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;

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

আপডেট : utf8mb4 / utf8mb4_unicode_ci এখন পছন্দের অক্ষর সেট / কোলেশন পদ্ধতি। utf8_general_ci এর বিরুদ্ধে পরামর্শ দেওয়া হচ্ছে, কারণ পারফরম্যান্সের উন্নতি নগদ নয়। Https://stackoverflow.com/a/766996/1432614 দেখুন


1
এছাড়া যোগ করা সম্ভব COLLATE utf8_unicode_ciস্ট্রিং ধ্রুবক হবে: SET @EMAIL = 'abc@def.com' COLLATE utf8_unicode_ci;। এটি বিশেষত কার্যকর যদি আপনি কোন কনসোল থেকে স্ক্রিপ্ট চালাচ্ছেন, যেখানে কনসোলের ডিফল্ট এনকোডিংটি আপনার স্ট্রিং ধ্রুবকগুলির জোটের জন্য প্রযোজ্য।
গ্যাবর্শ

অথবা ডাটাবেস ফেলে এবং utf8_general_ci দিয়ে নতুন তৈরি করুন; কোলেশন।
ওলেকসেই ক্যাস্লিটসিন

2
ভবিষ্যতের রেফারেন্সের জন্য, আপনি দুটি কোলেশনের মধ্যে পার্থক্য বুঝতে না পারলে আপনার সমস্ত টেবিলটিকে utf8_general_ci এ পরিবর্তন করবেন না।
মানাটেক্স

1
@ গ্যাবরসচ স্ট্রিং ভেরিয়েবলগুলিতে কোলেট যুক্ত করা আমার পক্ষে সমাধান ছিল, আমি আপনার মন্তব্যটি লক্ষ্য করার আগে আমি এ সম্পর্কে একটি বিস্তারিত উত্তর লিখেছিলাম।
nkatsar

আমি একই ত্রুটি পাচ্ছি, (utf8mb4_unicode_ci, IMPLICIT)পরিবর্তে বাদে (utf8_unicode_ci, IMPLICIT)। আমি অজগর ব্যবহার করে ওয়েব থেকে ডেটা স্ক্র্যাপ করছি, তারপরে স্ক্র্যাপড ডেটা দিয়ে একটি সিএসভি ফাইল তৈরি করব, যা আমি আমার সার্ভারে পিএইচপি ফাইল দিয়ে প্রক্রিয়া করি যা ডেটাবেসে ডেটা আপলোড করে। আমার সমস্ত মাইএসকিউএল টেবিল / কলামগুলি হিসাবে কল্ট করা আছে utf8mb4_unicode_ci। সমস্যাটি উত্থাপিত হতে পারে কারণ আমি ডেথটি utf8অজগর / সিএসভির মতো এনকোড করেছি ?
oldboy

27

Utf8_unicode_ci এবং utf8_general_ci এর মধ্যে দ্বন্দ্বের সাথে অভিন্ন "অবৈধ মিশ্রণ" ত্রুটির উত্তর অনুসন্ধান করতে আমি অর্ধ দিন কাটিয়েছি।

আমি দেখতে পেয়েছি যে আমার ডাটাবেসে কিছু কলাম বিশেষভাবে utf8_unicode_ci কোলাটেড ছিল না । দেখে মনে হচ্ছে mysql এই কলামগুলিকে স্পষ্টভাবে মিলিয়েছে utf8_general_ci

বিশেষত, 'শো ক্রেটিট টেবিল 1' ক্যোয়ারী চালিয়ে নিচের মতো কিছু তৈরি করা হয়েছে:

| table1 | CREATE TABLE `table1` (
`id` int(11) NOT NULL,
`col1` varchar(4) CHARACTER SET utf8 NOT NULL,
`col2` int(11) NOT NULL,
PRIMARY KEY (`col1`,`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

'Col1' বর্ণটি রেখাটি নোট করুন (4) বর্ণচিহ্ন সেটটি utf8 নূলে একটি নির্দিষ্ট কোলেশন নির্দিষ্ট নেই। আমি তখন নিম্নলিখিত কোয়েরি চালিয়েছি:

ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;

এটি আমার "অবৈধ মিশ্রণ" ত্রুটির সমাধান করেছে। আশা করি এটি অন্য কাউকে সাহায্য করতে পারে।


7
ধন্যবাদ। 'শো ক্রেট টেবিল' হ'ল সমস্যাটির মূল কারণটি বোঝার এবং সমাধানের সহজতম উপায়।
জোড়ো

2
এছাড়াও মনে রাখবেন যে COLLATEপুরো টেবিলের জন্য নির্দিষ্টকরণ (অর্থাত্ ALTER TABLE table1 CHARSET utf8 COLLATE utf8_unicode_ci) সমস্যাটি সমাধান করবে না , এটি প্রতিটি (সমস্যাযুক্ত) কলামের জন্য করা উচিত।
স্কিপি লে গ্র্যান্ড গৌরু

6

আমার অনুরূপ সমস্যা ছিল, তবে প্রক্রিয়াটির অভ্যন্তরে এটি আমার কাছে ঘটেছিল, যখন আমার ক্যোয়ারী পরম পরিবর্তনশীল উদাহরণ ব্যবহার করে সেট করা হয়েছিল SET @value='foo'

এর কারণটি কী ছিল তা মেলে না collation_connectionএবং ডেটাবেস কোলেশন। collation_connectionম্যাচে পরিবর্তন হয়েছে collation_databaseএবং সমস্যা চলে গেছে। আমি মনে করি এটি পরম / মানের পরে সংযুক্ত করার চেয়ে আরও মার্জিত পদ্ধতির approach

সংক্ষেপে: সমস্ত জোট মিলতে হবে। ব্যবহার করুন SHOW VARIABLESএবং নিশ্চিত করুন collation_connectionএবং collation_databaseম্যাচ করুন (এছাড়াও টেবিলের জোট ব্যবহার করে পরীক্ষা করুন SHOW TABLE STATUS [table_name])।


1
একই সমস্যা আমার সাথে ঘটেছিল, আমি সরাসরি ভেরিয়েবল ডিক্লেয়ারেশনে কোলেশন সেট করে কোলেশন_ওয়াইওয়াই ভেরিয়েবল পরিবর্তন করা এড়াতে পারি। SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
nkatsar

5

@Bpile উত্তরের সাথে কিছুটা মিল, আমার কেসটি একটি my.cnf এন্ট্রি সেটিংস collation-server = utf8_general_ci। আমি বুঝতে পারার পরে (এবং উপরের সমস্ত কিছু চেষ্টা করার পরে), আমি জোর করে utf8_unicode_ci এর পরিবর্তে আমার ডাটাবেসটি utf8_general_ci এ সরিয়েছি এবং এটি হ'ল:

ALTER DATABASE `db` CHARACTER SET utf8 COLLATE utf8_general_ci;

1
এটি আশ্চর্যজনক যে কনফিগারেশনগুলি এত বেশি ছড়িয়ে পড়ে। সমস্ত কোলেশন ডিফল্ট একই জায়গায় সেট করা উচিত।
মানাট্যাক্স

0

আমার নিজের ক্ষেত্রে আমার নিম্নলিখিত ত্রুটি রয়েছে

'=' অপারেশনের জন্য অবৈধ মিশ্রণ (utf8_general_ci, IMPLICIT) এবং (utf8_unicode_ci, IMPLICIT) অবৈধ মিশ্রণ

$ this-> db-> নির্বাচন করুন ("users.username হিসাবে ম্যাট্রিক_নো, কনক্যাট (users.surname, '', users.first_name, '', users.last_name) পুরো নাম হিসাবে") -> যোগদান ('ব্যবহারকারী', 'ব্যবহারকারীগণ । ব্যবহারকারীর নাম = শ্রেণীকক্ষ_স্টুডেন্টস.মাট্রিক_না ',' বাম ') -> যেখানে (' শ্রেণীকক্ষ_স্টুডেন্টস.অ্যাসেশন_আইডি ', $ অধিবেশন) -> যেখানে (' শ্রেণীকক্ষ_স্টুডেন্টস.লেভেল_আইডি ', $ স্তর) -> যেখানে (' শ্রেণিকক্ষে_স্টুডেন্টস.ডেপট_আইডি ', $ বিভাগ );

গুগল অনুসন্ধানের কয়েক সপ্তাহ পরে আমি লক্ষ্য করেছি যে যে দুটি ক্ষেত্রের সাথে আমি তুলনা করছি তাতে বিভিন্ন জোটের নাম রয়েছে। প্রথমটির অর্থাত্ ব্যবহারকারীর নামটি utf8_general_ci এর হয় যখন দ্বিতীয়টি utf8_unicode_ci এর হয় তাই আমি দ্বিতীয় টেবিলের কাঠামোয় ফিরে গিয়ে দ্বিতীয় ক্ষেত্রটি (ম্যাট্রিক_নো) কে utf8_general_ci এ পরিবর্তন করেছি এবং এটি একটি কবজির মতো কাজ করেছে।


0

একই সমস্যা ( 1 , 2 , 3 , 4 ) সম্পর্কে বিশাল সংখ্যক প্রশ্ন সত্ত্বেও আমি এখানে এমন কোনও উত্তর খুঁজে পাইনি যা এখানে পারফরম্যান্সকে বিবেচনায় নিয়েছিল।

যদিও একাধিক কাজের সমাধান ইতিমধ্যে দেওয়া হয়েছে আমি পারফরম্যান্স বিবেচনা করতে চাই consideration

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

বিকল্প 1 এবং 2 ব্যবহার করে , কল কাস্ট পদ্ধতির ব্যবহার, সম্ভাব্য বাধা সৃষ্টি করতে পারে, কারণ কলামে সংজ্ঞায়িত কোনও সূচক পুরো স্ক্যানের কারণ হিসাবে ব্যবহৃত হবে না ।

যদিও আমি অপশন 3 চেষ্টা করে দেখিনি , আমার কুঁচিটি হ'ল এটি বিকল্প 1 এবং 2 এর একই পরিণতি ভোগ করবে ।

অবশেষে, বিকল্পটি 4 বড় টেবিলগুলির পক্ষে যখন এটি কার্যকর হয় তখন সেরা বিকল্প। আমি বোঝাতে চাইছি এমন অন্য কোনও ব্যবহার নেই যা মূল জোটের উপর নির্ভর করে।

এই সরলীকৃত ক্যোয়ারী বিবেচনা করুন:

SELECT 
    *
FROM
    schema1.table1 AS T1
        LEFT JOIN
    schema2.table2 AS T2 ON T2.CUI = T1.CUI
WHERE
    T1.cui IN ('C0271662' , 'C2919021')
;

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

নীচের ছবিতে এসকিএল ব্যাখ্যা দেখুন।

COLLATE usingালাই ব্যবহার করার সময় ভিজ্যুয়াল ক্যোয়ারী ব্যাখ্যা

অন্যদিকে, বিকল্প 4 সম্ভাব্য সূচকগুলির সুবিধা নিতে পারে এবং দ্রুত অনুসন্ধানগুলির দিকে পরিচালিত করে।

নীচের ছবিতে, আপনি একই বিকল্পটি প্রয়োগ করা বিকল্প 4 পরে চালানো দেখতে পাচ্ছেন , স্কিমা / টেবিল / কলামের জোট পরিবর্তন করে ওরফে।

কোলেশন পরিবর্তনের পরে ভিজ্যুয়াল ক্যোয়ারী ব্যাখ্যা, এবং সেইজন্য কোল্যাট কাস্ট ছাড়াই

উপসংহারে, যদি পারফরম্যান্স গুরুত্বপূর্ণ হয় এবং আপনি টেবিলের জোট পরিবর্তন করতে পারেন, বিকল্প 4 এ যান । যদি আপনাকে একটি একক কলামে অভিনয় করতে হয়, আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

ALTER TABLE schema1.table1 MODIFY `field` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

আপনার অবদানের জন্য আপনাকে ধন্যবাদ রাফায়েল, তবে আমি বিশ্বাস করি যে বিকল্পটি 1 সূচকটি ব্যবহার করবে, কারণ আপনি টেবিলটি ingালাই করছেন না, আপনি এসপিকে দেওয়ার আগে তুলনা মান।
মানাট্যাক্স

যে ইশারা জন্য ধন্যবাদ। এটা আমার ভুল ছিল. আমি আমার উত্তর অনুসারে সম্পাদনা করেছি।
রাফায়েল

0

এটি ঘটবে যেখানে কোনও কলাম স্পষ্টভাবে একটি আলাদা কোলেশনে সেট করা আছে বা সন্ধানী সারণীতে ডিফল্ট কোলেশন পৃথক।

আপনার যদি অনেকগুলি সারণী থাকে তবে এই কোয়েরিটি চালানোর সময় আপনি কোলেশন পরিবর্তন করতে চান:

select concat('ALTER TABLE ', t.table_name , ' CONVERT TO CHARACTER 
SET utf8 COLLATE utf8_unicode_ci;') from (SELECT table_name FROM 
information_schema.tables where table_schema='SCHRMA') t;

এটি প্রতি কলামে সঠিক কোলেশন ব্যবহার করতে সমস্ত টেবিলকে রূপান্তর করতে প্রয়োজনীয় প্রশ্নের আউটপুট দেবে


এটি তখনও ঘটে যখন (আমার ক্ষেত্রে যেমন) আপনার এসপির জন্য ডিফল্ট কোলেশন সারণী অনুসন্ধানের জন্য ব্যবহৃত কোলেশন চেয়ে আলাদা।
মানাটেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.