2015-12-25 11 views
8

के बीच चरित्र सेट अभी मैं थोड़ा उलझन में हूं, मेरे पास charset=utf8 के साथ पीडीओ कनेक्शन है और डीबी latin का उपयोग करता है।PHP और MySQL

इसका क्या अर्थ है?

मेरा विचार यह है कि इसका मतलब है कि PHP द्वारा किए गए प्रत्येक कनेक्शन को डीबी से भेजना या प्राप्त करना utf8 पर एन्कोड किया गया है। हालांकि मैंने बहुत कुछ पढ़ा है कि डीबी को भी एक ही वर्णमाला को PHP के रूप में उपयोग करना चाहिए।

क्या कोई भी कृपया PHP में वर्णित चरित्र की भूमिका और MySQL डीबी में विवरण की व्याख्या कर सकता है और उन्हें संरेखित करने का क्या फायदा है?

+0

इतने सारे। सबसे विदेशी भाषाएं। यदि आप इसे पढ़ने के इच्छुक हैं http://htmlpurifier.org/docs/enduser-utf8.html#whyutf8 – devpro

उत्तर

2

कहो पीएचपी भेजता MySQL के लिए कुछ पाठ संग्रहीत करने के लिए, की तरह

INSERT INTO `some_table` ("foo") VALUES 
('The quick brown fox jumps over the lazy dog'); 

कुछ इस क्वेरी के बुनियादी इरादे जाहिर स्ट्रिंग जल्दी भूरी लोमड़ी आलसी कुत्ते पर कूदता है स्टोर करने के लिए MySQL बताने के लिए है डेटाबेस में

यदि PHP यूटीएफ -8 का उपयोग करने के लिए कॉन्फ़िगर किया गया है, तो इसका मतलब है कि जब यह मानव पठनीय पात्रों को बाइनरी में परिवर्तित करता है - इसे MySQL पर प्रेषित करने के लिए - यह यूटीएफ -8 एन्कोडिंग सिस्टम का उपयोग कर वर्णों को परिवर्तित करेगा।
MySQL यूटीएफ -8 में एन्कोड किए गए अक्षरों को पढ़ सकता है और इसलिए यह समझने में कोई समस्या नहीं है कि डिजिटल पठनीय पात्रों में डिजिटल रूप से एन्कोडेड अनुक्रम T और h और e आदि का मतलब है।
MySQL latin1 का उपयोग कर some_table तालिका में डेटा संग्रहीत करने के लिए कॉन्फ़िगर किया गया है, जब यह स्ट्रिंग प्राप्त करता है, यह पात्रों को उनके UTF-8 latin1 समकक्ष एन्कोडिंग से परिवर्तित कर देंगे पूर्व harddisk करने के लिए डेटा को बचाने के लिए।
इस मामले में कोई समस्या नहीं है - क्योंकि अंग्रेजी वर्णमाला वर्णों को यूटीएफ -8 और लैटिन 1 दोनों द्वारा दर्शाया जा सकता है।
हालांकि, समस्या तब होती है जब स्ट्रिंग PHP ने निहित वर्ण भेजे हैं जिन्हें केवल यूटीएफ -8 द्वारा प्रदर्शित किया जा सकता है और लैटिन 1 नहीं, उदाहरण के लिए एक स्मार्ट उद्धरण । जब MySQL स्मार्ट कोट को डिजिटल रूप में परिवर्तित करने का प्रयास करता है, तो यह सक्षम नहीं होगा - क्योंकि लैटिन 1 में सचमुच का प्रतिनिधित्व करने के लिए परिभाषित कोई डिजिटल एन्कोडिंग नहीं है।
मुझे यकीन नहीं है कि MySQL की सटीक त्रुटि प्रबंधन प्रक्रिया तब होती है जब यह इस स्थिति से मुकाबला करती है, और क्या स्थिति पुनर्प्राप्त करने योग्य है, लेकिन आम तौर पर अंतिम परिणाम यह है कि अंतर्निहित एन्कोडिंग दूषित और अनुपयोगी होगी।
क्योंकि यह समस्या केवल उन पात्रों के लिए होती है जिन्हें दो प्रणालियों द्वारा प्रदर्शित नहीं किया जा सकता है - और यदि आपके सभी संचारों में से 99% अंग्रेजी वर्णों को शामिल करते हैं, तो आपको थोड़ी देर के लिए कोई समस्या नहीं दिखाई दे सकती है और फिर भी यह कभी-कभी कभी-कभी होगी चरित्र, लेकिन जब आप नोटिस की समस्या करते हैं तो ठीक होने की कोशिश कर निराशाजनक हो सकती है।

+0

यह बहुत ही बढ़िया है और यह बहुत बहुत धन्यवाद देता है। लेकिन आपसे पूछना चाहता था, अगर मैं php में utf8 का उपयोग करता हूं तो यह अनुशंसा की जाती है कि मैं इसे MySQL के साथ उपयोग करता हूं, भले ही मैं लगभग 20 कॉलम और 2000 पंक्तियों के साथ डीबी के साथ प्रदर्शन को सहेजने की कोशिश कर रहा हूं। और इसी समय के लिए मैं सिर्फ अंग्रेजी का उपयोग करता हूं (भविष्य में बदल सकता है) – moawaya

+0

कूल। मैं कल्पना नहीं कर सकता कि MySQL स्विचिंग क्यों विशेष रूप से डेटाबेस के साथ प्रदर्शन समस्याओं का कारण बनता है। लेकिन अगर आप चिंतित थे तो आप हमेशा एक डीबी स्थापित कर सकते हैं और पुराने और नए MySQL charsets के साथ अपने प्रश्नों को समय दे सकते हैं। मेरी समझ यह है कि जब MySQL रिलीज v6।0 यूटीएफ -8 डिफ़ॉल्ट वर्णसेट आगे बढ़ेगा –

+0

स्विचिंग से सवाल उठने का कारण नहीं होगा कि यह धीमा हो जाएगा। मेरी समझ है कि यूटीएफ 8 लैटिन की तुलना में अधिक जगह लेता है जिससे इसे क्वेरी करने में धीमा कर दिया गया है, कृपया सही है अगर मैं गलत हूं और मुझे अपनी स्थिति के बारे में अपना अंतिम सुझाव दें, मुझे पता है कि डीबी छोटा है लेकिन मैं कम से कम संसाधनों पर चल रहा हूं इसलिए मैं नहीं प्रश्नों के लिए सभी कप शक्ति चूसने की जरूरत है। – moawaya