ठीक है, मैं हार मानता हूं। मैं इस त्रुटि में 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?
Not case sensitive search with active record
https://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_collation_server
यह सब इस मेम बनाने के लिए मुझे का नेतृत्व किया:
निष्ठा से,
एक थक साथी डेवलपर।
धन्यवाद।
त्रुटि संदेश का तात्पर्य है कि MySQL दावा कर रहा है कि _client_ एक UTF8 चरित्र के रूप में 'खिला है'। (इसे utf8mb4 होने का दावा किया जाना चाहिए।) मुझे रूबी और एक्टिव रिकार्ड के इन्स और आउट नहीं पता हैं, लेकिन यही वह जगह है जहां मैं देखता हूं। –
इसके लिए धन्यवाद। मैंने इस मुद्दे पर समय के लिए काम करना बंद कर दिया है। मैं शायद कुछ हफ्तों में इसे वापस आऊंगा। अगर मैंने कभी इसे समझ लिया है तो मैं यहां जवाब दस्तावेज करूंगा। अजीब चीज यह है कि अब यह विकास (ओएस एक्स) में काम करता है लेकिन स्टेजिंग (उबंटू) –
में नहीं, मैंने टेक्स्ट के बजाए ब्लॉब का उपयोग करके इस समस्या को "फिक्सिंग" समाप्त कर दिया। –