2013-04-18 16 views
18

बस स्टीफन गेह्रिग को Is "SET CHARACTER SET utf8" necessary? का उत्कृष्ट उत्तर पढ़ें, जो कि क्वेरी की व्याख्या करने और चलाने के चरणों को समझाते हुए MySQL के दस्तावेज़ से थोड़ा आगे जाता है w.r.t. चरित्र सेट और collations, लेकिन मैं अभी भी character_set_connection का उद्देश्य नहीं देख सकता, या विशेष रूप से character_set_client से वर्ण_set_connection में कथन को ट्रांसकोड कर सकता हूं।character_set_connection का उद्देश्य क्या है?

कॉलम मानों की तुलना करते समय कॉलम के चरित्र सेट पर सीधे क्वेरी_सेट_क्लिएंट से क्वेरी और ट्रांसकोड के लिए character_set_client का उपयोग क्यों न करें? इस मध्यवर्ती चरण का उद्देश्य क्या है? मैनुअल शाब्दिक डंक की तुलना करने का उदाहरण देता है, लेकिन आप इसे पहले स्थान पर क्यों करना चाहते हैं, character_set_client में विरोध करने के रूप में character_set_connection में अकेले रहने दें? जब तक मेरी समझ नहीं आती (कुछ "चुनिंदा 'somestr' = 'x से' somestr ') कुछ गलत है।

धन्यवाद।

+0

आपको असंतोषजनक उत्तर मिल सकता है। मैं बहुत अच्छी तरह से हो सकता था कि MySQL नेटवर्क प्रोटोकॉल सर्वर का उपयोग एन्कोडिंग स्थानांतरित करने का समर्थन नहीं करता था और इसके लिए क्लाइंट को नेटवर्क पर आने वाले पात्रों की व्याख्या करने के बारे में जानने के लिए आवश्यक था, और यह संगतता कारणों के लिए नहीं टूटा गया है। मैं बस अनुमान लगा रहा हूं, यह कोई जवाब नहीं है। – 0xCAFEBABE

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, और शायद मुझे समझ में नहीं आ रहा है, लेकिन मुझे लगता है कि character_set_results का उपयोग परिणाम भेजने के लिए किया जाता है और यह ग्राहक द्वारा चुना जाता है। जहां तक ​​मुझे स्पष्टीकरण से पता है, character_set_connection केवल MySQL द्वारा आंतरिक रूप से उपयोग किया जाता है। – lm713

+0

मेरा मानना ​​है कि MySQL डेटा –

उत्तर

1

दो, कि character_set_client में विभिन्न चारसेट बयान में ग्राहक से भेज दिया जाता है, और इसलिए चारसेट सर्वर बयान की व्याख्या करने का उपयोग करता है माना जाता है रहे हैं, जबकि character_set_connection क्या सर्वर प्रसंस्करण के लिए में बयान बदल देता है ।

character_set_connection शाब्दिक तारों की तुलना के लिए चर्चा के रूप में उपयोग किया जाता है। यह जरूरी नहीं है कि समीकरण के दोनों तरफ शाब्दिक तार होना चाहिए। उदाहरण:

WHERE column_name = 'literal_string' 
    (charset col) (charset connection) 

यदि कॉलम और कनेक्शन के चरित्र सेट अलग हैं, तो तुलना अवैध है और एक त्रुटि होगी।

परिणाम (और प्रतिक्रिया संदेश) को क्लाइंट को वापस भेजने के लिए character_set_results में एन्कोड किया जाता है।

+0

प्राप्त करते समय उपयोग करेगा, यह उत्तर प्रश्न के महत्वपूर्ण भाग को याद करता है: क्यों character_set_client से सीधे परिवर्तित नहीं होता? – goat

+1

तुलना ऑपरेशन के दौरान कोई अंतर्निहित रूपांतरण नहीं है, इसलिए क्लाइंट और सर्वर (कॉलम) अलग-अलग वर्णमाला में होने पर मध्यस्थ चरण आवश्यक है। – Hearth

+0

मैंने डेवलपर्स के दृष्टिकोण से सवाल का अर्थ बताया कि हमारे पास यह अतिरिक्त विकल्प क्यों है और यह क्या करता है? यदि आप दार्शनिक रूप से पूछना चाहते हैं कि सर्वर इस तरह से व्यवहार क्यों करता है, तो शायद यह MySQL dev टीम में सबसे अच्छा निर्देशित है, क्योंकि यह स्पष्ट रूप से कुछ सैज पर एक डिज़ाइन निर्णय था। – Hearth

0

ऐसा इसलिए है क्योंकि MySQL प्रत्येक स्ट्रिंग शाब्दिक के अपने चरित्र सेट की अनुमति देता है। उस ने कहा, एक बयान में स्ट्रिंग अक्षर का चरित्र सेट हमेशा कथन के समान नहीं होता है।

के मैनुअल में यह पेज देखें: http://dev.mysql.com/doc/refman/5.5/en/charset-literal.html

-1
> <?php 

// ... (create a connection to mysql) ... 

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn); 

$re = mysql_query('SHOW VARIABLES LIKE "%character_set%";')or die(mysql_error()); 
while ($r = mysql_fetch_assoc($re)) 
{ 
    var_dump ($r); echo "<br />"; 
} 

exit; 

?> 

सभी महत्वपूर्ण चर अब कर रहे हैं utf-8 और हम सुरक्षित रूप से किसी भी एन्कोडिंग कार्यों के बिना mysql_escape_string ($ वर) के साथ आवेषण या का चयन करता है का उपयोग कर सकते हैं।

+0

यदि आप 'SET' क्वेरी के माध्यम से कनेक्शन चर सेट करते हैं, तो आप ** सुरक्षित रूप से क्लाइंट-साइड से बचने का उपयोग नहीं कर सकते हैं, और निश्चित रूप से 'mysql_escape_string' के साथ नहीं। आपको 'mysql_set_charset()' क्लाइंट साइड का उपयोग करने की आवश्यकता है और फिर 'mysql_real_escape_string' का उपयोग करें। या शुरू करने के लिए बहिष्कृत mysql एपीआई से गुजरना। – deceze

5

जवाब और प्रलेखन पढ़ने के बाद, मैं केवल character_set_connection (और _collation) के लिए एक उपयोग के मामले के बारे में सोच सकते हैं:

चुनें "StringA" < "STRING बिलियन"

character_set_client केवल के लिए मायने रखती है सर्वर में स्थानांतरण। character_set_connection (और संयोजन, जो चरित्र सेट से स्वतंत्र नहीं है) बयान के व्याख्या के लिए मायने रखता है। चाहे "स्ट्रिंगए" "स्ट्रिंगबी" से कम है, अक्षर के सेट सेट और संयोजन पर निर्भर करता है। एक डेवलपर एक चरित्र सेट/संयोजन चुन सकता है जो character_set_client से अलग है।

अभ्यास में, character_set_connection अधिकतर समय से कोई फर्क नहीं पड़ता, क्योंकि शाब्दिक स्तंभों की तुलना में तुलना की जाती है, इस मामले में कॉलम का वर्णमाला और संयोजन का उपयोग किया जाता है।

अगर मैं गलत हूं तो मुझे सुधारें!

https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html देखें:

क्या वर्ण सेट सर्वर के बाद इसे प्राप्त करने के लिए एक बयान का अनुवाद करना चाहिए? इसके लिए, सर्वर character_set_connection और collation_connection सिस्टम चर का उपयोग करता है। यह ग्राहक द्वारा को क्लाइंट द्वारा character_set_client से character_set_connection पर भेजे गए कथन को परिवर्तित करता है (स्ट्रिंग अक्षर के अलावा जो _latin1 या _utf8 जैसे परिचयकर्ता हैं) को छोड़कर। शाब्दिक तारों की तुलना के लिए collation_connection महत्वपूर्ण है। कॉलम मानों के साथ तारों की तुलना के लिए, collation_connection कोई फर्क नहीं पड़ता क्योंकि कॉलम का अपना संयोजन है, जिसमें उच्च संयोजन प्राथमिकता है।

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