Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या SET CHARACTER SET utf8 आवश्यक है?

SET CHARACTER SET utf8 . का उपयोग करना SET NAMES utf8 . का उपयोग करने के बाद वास्तव में character_set_connection को रीसेट कर देगा और collation_connection करने के लिए
@@character_set_database और @@collation_database क्रमशः।

मैनुअल बताता है कि

  • SET NAMES x

    . के बराबर है
    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • और SET CHARACTER SET x

    . के बराबर है
    SET 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 क्वेरी को संसाधित करने के लिए उपयोग करती है और इसके परिणाम एक बहु-चरणीय चीज है:

  1. MySQL आने वाली क्वेरी को character_set_client में एन्कोडेड मानती है ।
  2. MySQL कथन को character_set_client . से ट्रांसकोड करता है character_set_connection . में
  3. स्ट्रिंग मानों की स्तंभ मानों से तुलना करते समय MySQL character_set_connection से स्ट्रिंग मान को ट्रांसकोड करता है दिए गए डेटाबेस कॉलम के कैरेक्टर सेट में और सॉर्टिंग और तुलना करने के लिए कॉलम कॉलेशन का उपयोग करता है।
  4. 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 में स्टेटिकली सेट किया जा सकता है। ) आपको प्रत्येक कनेक्ट पर आवश्यक अतिरिक्त क्वेरी के प्रदर्शन ओवरहेड से मुक्त करता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. django.db.utils.operationalError:(2059, प्रमाणीकरण प्लगइन 'caching_sha2_password')

  2. कमांड लाइन के माध्यम से लिनक्स पर एक MySQL उपयोगकर्ता बनाएं

  3. बहु क्वेरी में प्रत्येक INSERT कथन की आईडी पुनर्प्राप्त करें

  4. मैसकल सेलेक्ट स्पीड में सुधार

  5. यदि मान मौजूद नहीं है तो केवल पंक्ति लौटाएं