2015-09-10 6 views
6

ठीक है, मैं हार मानता हूं। मैं इस त्रुटि में 2 दिन हूं और मुझे मदद चाहिए।ऑपरेशन के लिए collations (utf8mb4_unicode_ci, EXPLICIT) और (utf8_general_ci, COERCIBLE) का अवैध मिश्रण '='

अस्वीकरण: मुझे इस प्रश्न में सुधार करने में मदद की आवश्यकता होगी और इस मुद्दे को हल करने के लिए मैंने अभी तक क्या किया है, और ब्लॉग पोस्ट और दस्तावेज जो मैंने पढ़ा है साझा करें एक समाधान की तलाश में।

प्रश्न (भी संदर्भ में नीचे से पूछा):

So the question is, why does the same query behave differently when run from Rails instead of from the mysql command line? Specifically, where is "(utf8_general_ci,COERCIBLE)" coming from?

समस्या: Autoresponder.find_by(keyword: '') निम्नलिखित त्रुटि के साथ विफल:

ActiveRecord::StatementInvalid: Mysql2::Error: Illegal mix of collations 
(utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) 
for operation '=': 
SELECT `autoresponders`.* 
FROM `autoresponders` 
WHERE `autoresponders`.`keyword` = '' 
LIMIT 1 

Autoresponder एक मॉडल विशेषता है कि keyword

मैंने पढ़ा कि मुझे अपनी टक्कर निर्दिष्ट करने की आवश्यकता है। तो मैं निम्नलिखित कोड बाहर का परीक्षण किया:

Autoresponder.where('keyword collate utf8mb4_unicode_ci = ?', '') 

और निम्न त्रुटि मिला:

Illegal mix of collations 
(utf8mb4_unicode_ci,EXPLICIT) and (utf8_general_ci,COERCIBLE) 
for operation '=': 
SELECT `autoresponders`.* 
FROM `autoresponders` 
WHERE (keyword collate utf8mb4_unicode_ci = '') 

सभी ने ऐसा ही किया था निहित से स्पष्ट करने के लिए मिलान बदल जाते हैं।

मैंने सेक्वेल प्रो में क्वेरी चलाने का प्रयास किया और यह काम किया (कोलेट कीवर्ड के साथ और बिना)। स्पष्टता के लिए यहां प्रश्न है:

SELECT `autoresponders`.* 
FROM `autoresponders` 
WHERE (keyword collate utf8mb4_unicode_ci = ''); 

SELECT `autoresponders`.* 
FROM `autoresponders` 
WHERE (keyword = ' '); 

और यह काम करता है! प्रश्न त्रुटियों के बिना भाग गया। मैं भी mysql भाग गया और वहां भी क्वेरी चलाने में सक्षम था। लेकिन मैंने कुछ देखा जब मैंने क्वेरी को mysql कमांड लाइन में चिपकाया। यह स्वचालित रूप से वास्तविक चरित्र के बजाय चरित्र के लिए यूनिकोड नाम का उपयोग करता है। MySQL कमांड लाइन में देखी गई क्वेरी यहां दी गई है:

SELECT `autoresponders`.* 
FROM `autoresponders` 
WHERE (keyword collate utf8mb4_unicode_ci ='\U+1F615'); 

यह क्वेरी काम करती है।

तो सवाल यह है कि रेल में समान प्रश्न क्यों विफल रहता है लेकिन सेक्वेल प्रो में काम करता है? विशेष रूप से, "(utf8_general_ci, COERCIBLE)" कहां से आ रहा है, और मैं इस गड़बड़ी को कैसे ठीक करूं?

मैंने सोचा था कि यह ActiveRecord से आ सकता है, लेकिन रेल कंसोल में ActiveRecord::Base.connection.collation चल देता है utf8mb4_unicode_ci

यहाँ मेरी db वर्ण एन्कोडिंग और मिलान चर (और क्वेरी है कि उन्हें पुनः प्राप्त) कर रहे हैं।

CREATE TABLE `autoresponders` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `keyword` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT '', 
    `body` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `created_at` datetime DEFAULT NULL, 
    `updated_at` datetime DEFAULT NULL, 
    `provisioned_number_id` int(11) DEFAULT NULL, 
    `outgoing_provisioned_number_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC; 

प्रसंग:: रेल 4.0.13, MySQL संस्करण 5.6.22-1 + deb.sury

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; 
character_set_client  utf8mb4 
character_set_connection utf8mb4 
character_set_database  utf8mb4 
character_set_filesystem binary 
character_set_results  utf8mb4 
character_set_server  latin1 
character_set_system  utf8 
collation_connection  utf8mb4_unicode_ci 
collation_database   utf8mb4_unicode_ci 
collation_server   latin1_swedish_ci 

यहाँ Autorsponders तालिका के लिए वाक्य रचना पैदा करते हैं।org ~ सटीक + 1-लॉग इन करें

यहाँ कुछ ब्लॉग पोस्ट और एसओ लेख है कि मैं अब तक पढ़ा है कर रहे हैं: https://mathiasbynens.be/notes/mysql-utf8mb4

http://airbladesoftware.com/notes/fixing-mysql-illegal-mix-of-collations/

Is "SET CHARACTER SET utf8" necessary?

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

Not case sensitive search with active record

https://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_collation_server

यह सब इस मेम बनाने के लिए मुझे का नेतृत्व किया:

enter image description here

निष्ठा से,

एक थक साथी डेवलपर।

धन्यवाद।

+2

त्रुटि संदेश का तात्पर्य है कि MySQL दावा कर रहा है कि _client_ एक UTF8 चरित्र के रूप में 'खिला है'। (इसे utf8mb4 होने का दावा किया जाना चाहिए।) मुझे रूबी और एक्टिव रिकार्ड के इन्स और आउट नहीं पता हैं, लेकिन यही वह जगह है जहां मैं देखता हूं। –

+0

इसके लिए धन्यवाद। मैंने इस मुद्दे पर समय के लिए काम करना बंद कर दिया है। मैं शायद कुछ हफ्तों में इसे वापस आऊंगा। अगर मैंने कभी इसे समझ लिया है तो मैं यहां जवाब दस्तावेज करूंगा। अजीब चीज यह है कि अब यह विकास (ओएस एक्स) में काम करता है लेकिन स्टेजिंग (उबंटू) –

+0

में नहीं, मैंने टेक्स्ट के बजाए ब्लॉब का उपयोग करके इस समस्या को "फिक्सिंग" समाप्त कर दिया। –

उत्तर

6

मुझे इसी तरह की समस्या से मुलाकात हुई और अंत में हल हो गया। सबसे पहले, मेरी MySQL conf है:

character-set-server = utf8 
collation-server  = utf8_general_ci 

एक दिन, मैंने पाया कि इमोजी इस तरह केवल utf8mb4 साथ सही ढंग से बचाया जा सकता है, तो मैं बदलने निर्दिष्ट स्तंभ के चरित्र सेट और मिलान:

`nickname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 

अब तक, सब कुछ ठीक है, डेटा जावा वेब एप्लिकेशन द्वारा सहेजा जा सकता है और सही ढंग से प्रदर्शित किया जा सकता है।

लेकिन जब मैं

की तरह डेटा को क्वेरी
SELECT * FROM table_name WHERE nickname LIKE '%%'; 

त्रुटि को जन्म देती है।

अंत में मैं

character-set-server = utf8mb4 
collation-server  = utf8mb4_unicode_ci 

को mysql conf बदल गया है और सब कुछ ठीक हो जाता है।

Here is a screenshot of mysql client, notice the nickname attribute

संबंधित मुद्दे