MySQL में, यदि मैं VARCHAR(32)
UTF-8 तालिका में एक नया क्षेत्र बनाता हूं तो इसका मतलब है कि मैं उस क्षेत्र में 32 बाइट डेटा या 32 वर्ण (बहु-बाइट) संग्रहीत कर सकता हूं?
MySQL में, यदि मैं VARCHAR(32)
UTF-8 तालिका में एक नया क्षेत्र बनाता हूं तो इसका मतलब है कि मैं उस क्षेत्र में 32 बाइट डेटा या 32 वर्ण (बहु-बाइट) संग्रहीत कर सकता हूं?
जवाबों:
यह उत्तर मेरे Google खोज परिणामों में सबसे ऊपर दिखा लेकिन यह सही नहीं था:
भ्रम की वजह शायद mysql के विभिन्न संस्करणों का परीक्षण किया जाना है।
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html
MySQL चरित्र इकाइयों में चरित्र स्तंभ परिभाषाओं में लंबाई विनिर्देशों की व्याख्या करता है। (MySQL 4.1 से पहले, कॉलम की लंबाई बाइट्स में व्याख्या की गई थी।) यह CHAR, VARCHAR और पाठ प्रकारों पर लागू होता है।
दिलचस्प है (मैंने इसके बारे में नहीं सोचा था) एक varchar कॉलम की अधिकतम लंबाई utf8 से प्रभावित होती है:
MySQL 5.0.3 और बाद में VARCHAR की प्रभावी अधिकतम लंबाई अधिकतम पंक्ति आकार (65,535 बाइट्स, जो सभी स्तंभों के बीच साझा की गई है) और उपयोग किए गए वर्ण सेट के अधीन है। उदाहरण के लिए, utf8 वर्णों को प्रति वर्ण तीन बाइट्स की आवश्यकता हो सकती है, इसलिए एक VARCHAR स्तंभ जो utf8 वर्ण सेट का उपयोग करता है, उसे अधिकतम 21,844 वर्णों के रूप में घोषित किया जा सकता है।
utf8mb4
) "(" (10 बवासीर के पू) को स्टोर कर सकता है, यह 10 अक्षर है लेकिन 40 बाइट्स है।
यह आपको 32 बहु-बाइट वर्ण संग्रहीत करने देगा
UTF-8 के साथ स्थान बचाने के लिए, CHAR के बजाय VARCHAR का उपयोग करें। अन्यथा, MySQL को CHAR CHARACTER SET utf8 कॉलम में प्रत्येक वर्ण के लिए तीन बाइट्स आरक्षित करने चाहिए क्योंकि यह अधिकतम संभव लंबाई है। उदाहरण के लिए, MySQL को CHAR (10) CHARACTER SET utf8 कॉलम के लिए 30 बाइट्स आरक्षित करने होंगे।
CHAR
करता हूं और जब मैं बहु-बाइट वर्णों को संग्रहीत करने का इरादा नहीं करता हूं, तो मैं सुरक्षित हूं। के बारे में क्या VARCHAR
आप सुनिश्चित हैं कि सीमा मल्टी-बाइट चार्ट में परिभाषित की गई है और सिंगल-बाइट चार्ट पर नहीं?
टकराव के varchar(32)
साथ 32 मल्टीबाइट डेटा utf8_unicode_ci
, मैंने अभी-अभी XAMPP के साथ परीक्षण किया है।
1234567890123456789012345678901234567890
इससे अलग हो जाएं:
12345678901234567890123456789012
ध्यान रखें कि ये नियमित ASCII वर्ण नहीं हैं।
utf8
, लेकिन तब आपको MySQL में टूटा हुआ यूनिकोड समर्थन मिलेगा। आपको utf8mb4
इसके बजाय एन्कोडिंग का उपयोग करना चाहिए , क्योंकि अधिकतम हैं। एक utf-8 char में 4 बाइट्स , MySQL के utf8 के वैरिएंट में 3 नहीं ...
उच्च-लगातार अपडेट तालिकाओं के लिए "चार" का उपयोग करना बेहतर है क्योंकि पंक्ति की कुल डेटा लंबाई तय और तेज होगी। वर्कर कॉलम पंक्ति डेटा आकार को गतिशील बनाते हैं। यह MyISAM के लिए अच्छा नहीं है, लेकिन मैं InnoDB और अन्य के बारे में नहीं जानता। उदाहरण के लिए, यदि आपके पास बहुत संकीर्ण "प्रकार" कॉलम है, तो केवल न्यूनतम स्थान का दावा करने के लिए लेट 1 चार्ट के साथ चार्ट (2) का उपयोग करना बेहतर हो सकता है।
CHAR
। InnoDB के लिए, कई अन्य चीजें चल रही हैं कि "गतिशील / निश्चित पंक्ति आकार" बहस अनिवार्य रूप से अप्रासंगिक है।
CHAR
।
यदि आप एक MySQL UTF8 कॉलम में PHP UTF8 स्ट्रिंग को बचाने के लिए डेटाबेस से कनेक्ट करते हैं, तो आप LT1 एन्कोडिंग का उपयोग कर सकते हैं (उदाहरण के लिए PHP के साथ), आपके पास एक डबल UTF8 एन्कोडिंग होगा।
यदि UTF8 स्ट्रिंग $s
32 अक्षर लंबा है, लेकिन 64 बाइट लंबा है और स्तंभ VARCHAR(32)
UTF8 है, तो डबल एन्कोडिंग स्ट्रिंग $s
को 64 वर्णों के लंबे UTF8 स्ट्रिंग में बदल देगा, जो कि डेटाबेस में उसके पहले 32 वर्णों के लिए पहले 32 बाइट्स के बराबर छोटा हो जाएगा। का है $s
। आप यह सोचकर समाप्त हो सकते हैं कि MySQL 5 MySQL 4 की तरह व्यवहार करता है लेकिन यह वास्तव में उसी प्रभाव का दूसरा कारण है।