2012-05-27 16 views
10

मैं phs में सरणी के बहुत से क्रमबद्ध कर रहा हूं जिसे mysql का उपयोग कर डेटाबेस में संग्रहीत किया जाना है।serialize (डेटा) के लिए कौन सा mysql कॉलम प्रकार?

अंतिम स्ट्रिंग की लंबाई 2000 से 100,000+ के बीच किसी भी चीज़ से काफी भिन्न हो सकती है, मैं सोच रहा था कि इसके लिए सबसे अच्छा कॉलम प्रकार क्या होगा?

वर्तमान में यह LONGTEXT के रूप में सेट है लेकिन मुझे लगता है कि यह अधिक है! डेटाबेस पहले से सक्रिय है और लगभग 3 मिलियन पंक्तियां हैं यह एक नया कॉलम है जो जल्द ही जोड़ा जाएगा।

धन्यवाद

+4

100,000 वर्ण आपके विकल्पों को बहुत अधिक प्रतिबंधित करते हैं। साथ ही, यदि आप कभी भी इन सरणी को MySQL में हेरफेर करना चाहते हैं या उन्हें खोजना चाहते हैं, या मूल रूप से डेटा के विशाल ब्लॉब के रूप में उनका इलाज करने के अलावा कुछ भी करते हैं, तो आपको क्रमबद्ध करने के बजाए उन्हें ठीक से स्टोर करना चाहिए। – Corbin

+0

यह केवल डेटा के लिए एक भंडारण केंद्र है जिसे PHP के माध्यम से प्रदर्शित किया जाना है, MySQL के माध्यम से हेरफेर कभी नहीं होगा। धन्यवाद @ कॉरबिन – hadley

+0

लांगबाइन फ़ील्ड प्रकारों के साथ बेहतर है। सभी टेक्स्ट फ़ील्ड वर्ण सेट अनुवादों के अधीन हैं, जो आपके क्रमबद्ध डेटा को दूषित कर सकते हैं। –

उत्तर

15

हमेशा डाटा serializing के लिए किसी भी BLOB data-type का उपयोग करें ताकि उसे काट नहीं मिलता है और एक द्विआधारी सुरक्षित तरीके से क्रमबद्धता टूट गया। यदि अंतिम स्ट्रिंग की लंबाई अधिकतम नहीं है तो आपको LONGBLOB की आवश्यकता होगी। यदि आप जानते हैं कि डेटा 2^24 वर्णों को भर नहीं पाएगा तो आप MEDIUMBLOB का उपयोग कर सकते हैं। MEDIUMBLOB लगभग 16 एमबी है जबकि LONGBLOB लगभग 4 जीबी है इसलिए मैं MEDIUMBLOB के साथ आपका सुंदर सुरक्षित कहूंगा।

क्यों बाइनरी डेटा प्रकार? MySQL में टेक्स्ट डेटा प्रकारों में एन्कोडिंग है। कैरेक्टर एन्कोडिंग का असर होगा कि धारावाहिक डेटा को अलग-अलग एन्कोडिंग के बीच कैसे स्थानांतरित किया जाता है। जैसे जब लैटिन -1 के रूप में संग्रहीत किया जाता है लेकिन फिर यूटीएफ -8 के रूप में पढ़ा जाता है (उदाहरण के लिए डेटाबेस ड्राइवर कनेक्शन एन्कोडिंग सेटिंग की वजह से), क्रमबद्ध डेटा टूटा जा सकता है क्योंकि बाइनरी ऑफसेट को स्थानांतरित किया गया है, हालांकि धारावाहिक डेटा को इस तरह के बदलावों के लिए एन्कोड नहीं किया गया था। PHP के क्रमबद्ध तार बाइनरी डेटा हैं, न कि किसी विशिष्ट एन्कोडिंग के साथ।

7

आप serialize() के लिए प्रति पीएचपी मैनुअल ब्लॉब (के रूप में मार्क बी का उल्लेख किया) का चयन करना चाहिए:

"ध्यान दें कि यह [आउटपुट] एक द्विआधारी स्ट्रिंग जो अशक्त बाइट्स शामिल हो सकते हैं, और की जरूरत है संग्रहीत करने के लिए और इस तरह से संभाला गया। उदाहरण के लिए, serialize() आउटपुट को आमतौर पर एक चार्ट या टेक्स्ट फ़ील्ड के बजाय किसी डेटाबेस में किसी BLOB फ़ील्ड में संग्रहीत किया जाना चाहिए। "

स्रोत: http://php.net/serialize

बेशक आकार के बारे में J.Money के इनपुट के रूप में अच्छी तरह से ध्यान में रखा जाना चाहिए - यहां तक ​​कि ब्लॉब अपनी सीमा नहीं है, और आप MEDIUMBLOB या LONGBLOB की आवश्यकता होगी अगर आप उन्हें तब पार करने के लिए जा रहे हैं ।

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