2013-05-22 5 views
5
mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci; 
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary' 

मैं इस त्रुटि से कैसे छुटकारा पा सकता हूं?COLLATION 'utf8_general_ci' वर्णक सेट 'बाइनरी' के लिए मान्य नहीं है?

क्या मैं पहले से ही करने की कोशिश की (कॉपी & पेस्ट):

$ mysql -u admin -p $DATABASE 
Enter password: 
Reading table information for completion of table and column names 
You can turn off this feature to get a quicker startup with -A 

Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 2 
Server version: 5.1.69 Source distribution 

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci; 
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary' 
mysql> SET NAMES utf8; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci; 
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary' 
mysql> SELECT LOCATE(_utf8"n", _utf8"München") COLLATE utf8_general_ci; 
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary' 
mysql> SHOW VARIABLES LIKE "character_set_database"; 
+------------------------+-------+ 
| Variable_name   | Value | 
+------------------------+-------+ 
| character_set_database | utf8 | 
+------------------------+-------+ 
1 row in set (0.00 sec) 

उत्तर

2

संभवतः सर्वर, द्विआधारी की एक डिफ़ॉल्ट वर्ण सेट के साथ संकलित किया गया है ताकि स्ट्रिंग शाब्दिक इस तरह के रूप में व्याख्या की जा रही हैं, या ग्राहक सर्वर के साथ संवाद करते समय एक बाइनरी मोड का उपयोग करने के लिए सेट है। आप SET NAMES utf8 पर कॉल करके क्लाइंट और कनेक्शन कैरेक्टर सेट को बदल सकते हैं (हालांकि यह अनुशंसा नहीं की जाती है कि यदि आपके एसक्यूएल स्टेटमेंट PHP से जारी किए जा रहे हैं, उदाहरण के लिए, क्योंकि PHP के पास कनेक्शन कैरेक्टर सेट सेट करने के लिए अपने आदेश होंगे)। MySQL संदर्भ मैनुअल में Connection Character Sets and Collations देखें।

वैकल्पिक रूप से आप स्पष्ट रूप में स्ट्रिंग शाब्दिक के लिए इस्तेमाल किया अक्षरसेट निर्दिष्ट "परिचयकर्ता" का उपयोग कर सकते अपने समारोह ढूँढें, उदाहरण के लिए:

LOCATE(_utf8"n", _utf8"München") 

अधिक जानकारी के लिए संदर्भ मैनुअल पेज Character String Literal Character Set and Collation देखें।

+0

कौन सी तालिका? मेरी क्वेरी एक तालिका का संदर्भ नहीं देती है। – feklee

+0

क्षमा करें, यहां आधा सो जाओ। मैंने जवाब पूरी तरह से बदल दिया है। – Bobulous

+0

प्रश्न पूछने से पहले, मैंने 'सेट नाम utf8'' की कोशिश की, और अब सफलता के बिना। * परिचयकर्ता * एक अच्छा समाधान की तरह दिखते हैं, लेकिन वे काम नहीं करते: त्रुटि संदेश बनी रहती है। मैंने कोशिश की: 'चयन करें (_utf8 "n", _utf8 "म्यूनचेन") COLLATE utf8_general_ci' वैसे, मैं सीधे खेलने के लिए कंसोल का उपयोग कर रहा हूं। मैंने कंसोल शुरू किया: 'mysql -u admin -p $ डेटाबेस' मैं बस 'character_set_database "जैसे चर दिखाता हूं।परिणाम: 'utf8' – feklee

2

COLLATE मेरे उदाहरण में LOCATE की sets the collation of the return value, जिसके परिणामस्वरूप प्रकार binary की है।

तर्कों के मिलान सेट करने के लिए:

mysql> SELECT LOCATE(_utf8"n" COLLATE utf8_general_ci, 
        _utf8"München" COLLATE utf8_general_ci) AS locate; 
+--------+ 
| locate | 
+--------+ 
|  3 | 
+--------+ 
1 row in set (0.00 sec) 

मेरे प्रेरणा वास्तव में यह जानने गया था कि क्या MySQL जब-स्ट्रिंग के लिए खोज खाते में मिलान लेता है। दुर्भाग्य से यह नहीं है। अस्थायी तालिका के साथ

mysql> SELECT LOCATE(_utf8"ü" COLLATE utf8_general_ci, 
        _utf8"München" COLLATE utf8_general_ci) AS locate; 
+--------+ 
| locate | 
+--------+ 
|  2 | 
+--------+ 
1 row in set (0.00 sec) 

mysql> SELECT LOCATE(_utf8"u" COLLATE utf8_general_ci, 
        _utf8"München" COLLATE utf8_general_ci) AS locate; 
+--------+ 
| locate | 
+--------+ 
|  0 | 
+--------+ 
1 row in set (0.00 sec) 

टेस्ट (मिलान WHERE खंड में ध्यान में रखा है, लेकिन में नहीं LOCATE): दूसरा आदेश का परिणाम देखें

mysql> CREATE TEMPORARY TABLE test 
     (text VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO test VALUES("München"); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT text FROM test WHERE text LIKE "%u%"; 
+---------+ 
| text | 
+---------+ 
| München | 
+---------+ 
1 row in set (0.00 sec) 

mysql> SELECT LOCATE("u", text) AS locate FROM test WHERE text LIKE "%u%"; 
+--------+ 
| locate | 
+--------+ 
|  0 | 
+--------+ 
1 row in set (0.01 sec) 
0

मैं जानता हूँ कि यह देर हो चुकी है, लेकिन मुझे उम्मीद है कि यह किसी की मदद करेगा। मुझे एक ही त्रुटि मिल रही थी और मुझे पता था कि मेरे क्रिससेट और कॉलेशन ठीक थे।

अपने कथन में '@' प्रतीकों की जांच करें जो संबंधित नहीं हैं। मैं चर के साथ एक चयन कथन के रूप में अपनी संग्रहीत प्रक्रिया का परीक्षण कर रहा था, फिर संग्रहित proc को '@' प्रतीकों को हटाने के लिए भूल गया था। कहने की जरूरत नहीं है, मुझे बहुत मूर्खतापूर्ण महसूस हुआ।

मुझे यह भी पता है कि यह इस प्रश्न में मामला प्रतीत नहीं होता है लेकिन यह मेरा पहला एसओ पोस्ट है और मेरे पास बहुत कुछ करने के लिए पर्याप्त प्रतिनिधि नहीं है, इसलिए मैं क्षमा चाहता हूं।

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