टकरावों का अवैध मिश्रण MySQL त्रुटि


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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

इसके समाधान के लिए क्या किया जा सकता है? क्या मैं किसी तरह से तार से बच सकता हूं, इसलिए यह त्रुटि नहीं होगी, या क्या मुझे किसी तरह से अपनी तालिका एन्कोडिंग को बदलने की आवश्यकता है, और यदि हां, तो मुझे इसमें क्या बदलना चाहिए?


यह त्रुटि है, यह एक इंजेक्शन है या नहीं?
हमजा इरिजाज

1
क्या इससे आपके सवाल का जवाब मिलता है? MySql में collations त्रुटि की अवैध मिश्रण
फरहान

जवाबों:


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;

MySQL में किसी समय बिना किसी समझदार कारण के लिए सनी को सिन।


3
@ बीन: सीधे कॉपी-पेस्ट करने योग्य समाधान के लिए धन्यवाद। मुझे बहुत समय बचाया।
पिस्तोस

15
@ बान: यह शुरू में एक स्वीडिश कंपनी द्वारा विकसित किया गया था ... यही कारण है कि कष्टप्रद लैटिन 1_स्विक_का प्रारंभिक सेटिंग के पीछे .. :(
वजेक हर्मेज़ेज़

1
मेरे पास पहला बयान करने की अनुमति नहीं थी, लेकिन यह सिर्फ टेबल पर काम कर रहा था
रॉब सेडविक

इसके लिए आपको प्यार! : P
prateekkathal

यह बहुत से लोगों के लिए काम करता है, लेकिन दुर्भाग्य से इस धागे में डिवाइस के सभी प्रयास करने के बाद भी मुझे यह समस्या है। मेरा डेटाबेस डिफॉल्ट कोलाजेशन 'ucs2_bin' से बदलने से इनकार करता है, इसलिए यहां तक ​​कि सभी टेबलों और कनेक्शन के कोलाज को 'usc2_bin' में बदलने की कोशिश की गई, लेकिन मुझे अभी भी त्रुटि "SQL त्रुटि (1267)" मिली: कोलाज का अवैध मिश्रण (utf8_general_ci, IMPLICIT) और (ucs2_bin, IMPLICIT) ऑपरेशन '=' के लिए।
bikeman868

15

आपको अपनी तालिका एन्कोडिंग और कनेक्शन एन्कोडिंग दोनों को सेट करना चाहिए UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

तथा

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

क्या इन दोनों की जरूरत है, या मैं बस उनमें से एक कर सकता हूं?
अपवोट

पहले से myDbबताएं चार्टर सेट करें utf8 COLLATE utf8_bin। क्या इससे काम हो जायेगा? ऐसा किया जाता है, इसलिए यह मेरी सभी तालिकाओं को प्रभावित करेगा, न कि उनमें से केवल एक
क्लिक करें Upvote

1
केवल आपके वर्तमान तालिका सेटिंग में परिवर्तन नहीं किया जाएगा, केवल नए बनाए गए। हालांकि यह डेटाबेस के लिए डिफ़ॉल्ट चारसेट को बदलने के लिए भी चोट नहीं पहुंचाएगा।
क्वासोनि

सेट नाम और सेट वर्ण सेट आपके कनेक्शन एन्कोडिंग को बदल देगा। आपको अपने कनेक्ट होने पर हर बार इन कमांड को जारी करने की आवश्यकता होती है। आप क्लाइंट लाइब्रेरी इसे करने के लिए अधिक सुंदर विधि का समर्थन कर सकते हैं (php :: mysqli does, php :: mysql does not)।
क्वासोनि

अब के लिए काम करने लगता है, मैं कुछ और परीक्षण के बाद स्वीकार करेंगे। क्या दूसरे प्रश्नों को एक बार या प्रत्येक स्क्रिप्ट के आरंभ में चलाने की आवश्यकता है?
Upvote

13
CONVERT(column1 USING utf8)

मेरी समस्या का समाधान करता है। जहां column1 वह कॉलम है जो मुझे यह त्रुटि देता है।


मेरे लिए, इसने काम किया: CONVERT ("column1" USAT LATIN1)
shasi kanth

4

त्रुटि के लिए निम्नलिखित कथन का उपयोग करें

यदि डेटा तालिका में है तो अपने डेटा के बारे में सावधानी बरतें।

 ALTER TABLE your_table_name CONVERT to CHARACTER SET utf8 COLLATE utf8_general_ci;

2

सामान्य तौर पर सबसे अच्छा तरीका है टेबल कोलाज को बदलना। हालांकि मेरे पास एक पुराना एप्लिकेशन है और परिणाम के बारे में अनुमान लगाने में वास्तव में सक्षम नहीं है कि क्या इसके दुष्प्रभाव हैं। इसलिए मैंने किसी तरह स्ट्रिंग को कुछ अन्य प्रारूप में परिवर्तित करने की कोशिश की, जिससे टकराव की समस्या हल हो गई। मुझे जो काम मिला वह स्ट्रिंग की तुलना हेक्साडेसिमल प्रतिनिधित्व में वर्णों को परिवर्तित करके करना है। डेटाबेस पर यह HEX(column).PHP के साथ किया जाता है आप इस फ़ंक्शन का उपयोग कर सकते हैं:

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);
}

डेटाबेस क्वेरी करते समय, आपके मूल UTF8 स्ट्रिंग को utf8_decode()DB में उपयोग करने से पहले पहले एक आईएसओ स्ट्रिंग (जैसे PHP में उपयोग करना) में परिवर्तित किया जाना चाहिए । समतलीकरण प्रकार के कारण डेटाबेस में UTF8 वर्ण नहीं हो सकते हैं, इसलिए तुलनात्मक घटना होनी चाहिए, हालांकि यह मूल स्ट्रिंग (UTF8 वर्णों को परिवर्तित करता है जो ISO charset परिणाम में मौजूद नहीं हैं? या ये पूरी तरह से हटा दिए जाते हैं)। बस यह सुनिश्चित करें कि जब आप डेटाबेस में डेटा लिखते हैं, तो आप उसी यूटीएफ 8 को आईएसओ रूपांतरण में उपयोग करते हैं।


2

मैंने अपनी तालिका मूल रूप से CHARSET = latin1 के साथ बनाई थी । Utf8 में तालिका रूपांतरण के बाद कुछ कॉलम परिवर्तित नहीं किए गए थे, हालांकि यह वास्तव में स्पष्ट नहीं था। आप चलाने SHOW CREATE TABLE my_table;और यह देखने की कोशिश कर सकते हैं कि कौन सा कॉलम परिवर्तित नहीं हुआ था या नीचे दिए प्रश्न के साथ समस्याग्रस्त कॉलम में गलत वर्ण सेट को ठीक करें (अपनी आवश्यकताओं के अनुसार परिवर्तन की लंबाई और वर्ण और वर्ण):

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


0

शीर्ष उत्तर में आपकी सुधारों को सूचीबद्ध करने के बाद, अपने सर्वर की डिफ़ॉल्ट सेटिंग्स बदलें।

आपके " /etc/my.cnf.d/server.cnf " या जहां यह कभी भी स्थित है [mysqld] अनुभाग में चूक जोड़ते हैं, इसलिए यह इस तरह दिखता है:

[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';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.