SET CHARACTER SET utf8 . का उपयोग करना SET NAMES utf8 . का उपयोग करने के बाद वास्तव में character_set_connection को रीसेट कर देगा और collation_connection करने के लिए@@character_set_database और @@collation_database क्रमशः।
मैनुअल बताता है कि
-
. के बराबर हैSET NAMES xSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x; -
और
. के बराबर हैSET CHARACTER SET xSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
जबकि SET collation_connection = x SET character_set_connection = <<character_set_of_collation_x>> को आंतरिक रूप से भी निष्पादित करता है और SET character_set_connection = x आंतरिक रूप से SET collation_connection = <<default_collation_of_character_set_x भी निष्पादित करता है ।
तो अनिवार्य रूप से आप character_set_connection . को रीसेट कर रहे हैं करने के लिए @@character_set_database और collation_connection करने के लिए @@collation_database . मैनुअल इन चरों के उपयोग की व्याख्या करता है:
इसे सारांशित करने के लिए, एन्कोडिंग/ट्रांसकोडिंग प्रक्रिया MySQL क्वेरी को संसाधित करने के लिए उपयोग करती है और इसके परिणाम एक बहु-चरणीय चीज है:
- MySQL आने वाली क्वेरी को
character_set_clientमें एन्कोडेड मानती है । - MySQL कथन को
character_set_client. से ट्रांसकोड करता हैcharacter_set_connection. में - स्ट्रिंग मानों की स्तंभ मानों से तुलना करते समय MySQL
character_set_connectionसे स्ट्रिंग मान को ट्रांसकोड करता है दिए गए डेटाबेस कॉलम के कैरेक्टर सेट में और सॉर्टिंग और तुलना करने के लिए कॉलम कॉलेशन का उपयोग करता है। - MySQL
character_set_resultsमें एन्कोड किए गए परिणाम सेट को बनाता है (इसमें परिणाम डेटा के साथ-साथ परिणाम मेटाडेटा जैसे स्तंभ नाम आदि शामिल हैं)
तो ऐसा हो सकता है कि एक SET CHARACTER SET utf8 पूर्ण UTF-8 समर्थन प्रदान करने के लिए पर्याप्त नहीं होगा। latin1 . के डिफ़ॉल्ट डेटाबेस कैरेक्टर सेट के बारे में सोचें और utf8 . के साथ परिभाषित कॉलम -चारसेट और ऊपर वर्णित चरणों से गुजरें। latin1 . के रूप में उन सभी वर्णों को शामिल नहीं कर सकता जिन्हें UTF-8 कवर कर सकता है आप चरण 3 . में वर्ण जानकारी खो सकते हैं .
- चरण 3 : यह देखते हुए कि आपकी क्वेरी UTF-8 में एन्कोड की गई है और इसमें ऐसे वर्ण हैं जिन्हें
latin1. के साथ प्रदर्शित नहीं किया जा सकता है ,utf8. से ट्रांसकोडिंग करने पर ये वर्ण खो जाएंगे सेlatin1(डिफ़ॉल्ट डेटाबेस कैरेक्टर सेट) जिससे आपकी क्वेरी विफल हो जाती है।
इसलिए मुझे लगता है कि यह कहना सुरक्षित है कि SET NAMES ... चरित्र सेट मुद्दों को संभालने का सही तरीका है। भले ही मैं आपके MySQL सर्वर वेरिएबल्स को सही तरीके से सेट कर रहा हूं (सभी आवश्यक वेरिएबल्स को आपके my.cnf में स्टेटिकली सेट किया जा सकता है। ) आपको प्रत्येक कनेक्ट पर आवश्यक अतिरिक्त क्वेरी के प्रदर्शन ओवरहेड से मुक्त करता है।