चरित्र सेट और टकराव का क्या मतलब है?


315

मैं MySQL प्रलेखन पढ़ सकता हूं और यह बहुत स्पष्ट है। लेकिन, कोई यह कैसे तय करता है कि किस चरित्र का उपयोग करना है? किस डेटा पर कोलाजेशन का प्रभाव पड़ता है?

मैं दो के स्पष्टीकरण के लिए पूछ रहा हूं और उन्हें कैसे चुनना है।

जवाबों:


511

MySQL डॉक्स से :

एक चरित्र सेट प्रतीकों और एन्कोडिंग का एक सेट है। एक मिलान एक वर्ण सेट में पात्रों की तुलना के लिए नियमों का एक सेट है। आइए एक काल्पनिक चरित्र सेट के एक उदाहरण के साथ भेद स्पष्ट करें।

मान लीजिए कि हमारे पास चार अक्षरों के साथ एक वर्णमाला है: 'ए', 'बी', 'ए', 'बी'। हम प्रत्येक अक्षर को एक नंबर देते हैं: 'ए' = 0, 'बी' = 1, 'ए = 2,' बी '= 3. अक्षर' ए 'एक प्रतीक है, नंबर 0' ए 'के लिए एन्कोडिंग है , और सभी चार अक्षरों और उनके एन्कोडिंग का संयोजन एक चरित्र सेट है।

अब, मान लीजिए कि हम दो स्ट्रिंग मानों की तुलना करना चाहते हैं, 'ए' और 'बी'। ऐसा करने का सबसे सरल तरीका एनकोडिंग को देखना है: 0 'ए' के ​​लिए और 1 'बी' के लिए। क्योंकि 0 1 से कम है, हम कहते हैं कि 'A' 'B' से कम है। अब, हमने जो कुछ किया है, वह हमारे चरित्र सेट से टकराव को लागू करता है। टकराव नियमों का एक समूह है (इस मामले में केवल एक नियम): "एन्कोडिंग की तुलना करें।" हम सभी संभव कोलाज को बाइनरी कॉलेशन से सबसे सरल कहते हैं।

लेकिन क्या होगा अगर हम कहना चाहते हैं कि लोअरकेस और अपरकेस अक्षर बराबर हैं? तब हमारे पास कम से कम दो नियम होंगे: (1) निचले अक्षर 'a' और 'b' को 'A' और 'B' के बराबर मानते हैं; (२) फिर एनकोडिंग की तुलना करें। हम इसे केस-असंवेदनशील टकराव कहते हैं। यह बाइनरी कॉलेशन से थोड़ा अधिक जटिल है।

वास्तविक जीवन में, अधिकांश चरित्र सेटों में कई अक्षर होते हैं: न केवल 'ए' और 'बी' बल्कि पूरे वर्णमाला, कभी-कभी कई वर्ण या हजारों अक्षरों के साथ पूर्वी लेखन प्रणाली, कई विशेष प्रतीकों और विराम चिह्नों के साथ। वास्तविक जीवन में भी, अधिकांश टकरावों के कई नियम हैं: न केवल असंवेदनशीलता, बल्कि उच्चारण असंवेदनशीलता भी (एक "उच्चारण" जर्मन 'ö' के रूप में एक चरित्र से जुड़ा हुआ चिह्न है) और कई-चरित्र मैपिंग (जैसे कि नियम): ö '=' OE 'दो जर्मन समागमों में से एक में)।


206

एक चरित्र एन्कोडिंग का एक तरीका है ताकि वे स्मृति में फिट हो सकें। यही है, अगर चार्ट ISO-8859-15 है, तो यूरो प्रतीक, €, 0xa4 के रूप में एन्कोड किया जाएगा, और UTF-8 में, यह 0xe282ac होगा।

मिलान पात्रों तुलना करने के लिए, latin9 में, वहाँ पत्र के रूप में है e é è ê f, अगर उनकी द्विआधारी प्रतिनिधित्व के अनुसार क्रमबद्ध, यह जाना होगा e f é ê èलेकिन मिलान करने के लिए सेट है, तो उदाहरण के लिए, फ्रेंच, तो आप उन्हें क्रम में होगा आप को लगा कि वे होगा, जो सभी e é è êसमान हैं, और फिर f


5
यह ध्यान रखना महत्वपूर्ण है कि एक एकल चारसेट के लिए कई अलग-अलग टकराव हो सकते हैं। जो "सही" है वह उस पाठ के शब्दार्थ पर निर्भर करता है, जो सामान्य रूप से उस भाषा से निर्धारित होता है, जिसमें वह लिखा होता है।
फिल

20

एक वर्ण सेट सभी लिखित ग्लिफ़ का सबसेट है। एक वर्ण एन्कोडिंग निर्दिष्ट करता है कि उन वर्णों को संख्यात्मक मानों में मैप कैसे किया जाता है। कुछ वर्ण एनकोडिंग, जैसे UTF-8 और UTF-16, यूनिवर्सल कैरेक्टर सेट में किसी भी वर्ण को एन्कोड कर सकते हैं। अन्य, जैसे US-ASCII या ISO-8859-1 केवल एक छोटे उपसमूह को एनकोड कर सकते हैं, क्योंकि वे क्रमशः प्रति वर्ण 7 और 8 बिट्स का उपयोग करते हैं। क्योंकि कई मानक वर्ण सेट और वर्ण एन्कोडिंग दोनों को निर्दिष्ट करते हैं, "वर्ण सेट" शब्द को अक्सर "वर्ण एन्कोडिंग" के लिए स्वतंत्र रूप से प्रतिस्थापित किया जाता है।

एक कोलाज में ऐसे नियम शामिल होते हैं जो निर्दिष्ट करते हैं कि छँटाई के लिए वर्णों की तुलना कैसे की जा सकती है। कोलाज नियम स्थानीय-विशिष्ट हो सकते हैं: दो वर्णों का उचित क्रम भाषा से भाषा में भिन्न होता है।

एक वर्ण सेट और कोलाज चुनना आपके आवेदन के अंतर्राष्ट्रीयकरण या नहीं होने के लिए नीचे आता है। यदि नहीं, तो आप किस लोकेल को लक्षित कर रहे हैं?

यह चुनने के लिए कि आप किस वर्ण का समर्थन करना चाहते हैं, आपको अपने आवेदन पर विचार करना होगा। यदि आप उपयोगकर्ता द्वारा आपूर्ति किए गए इनपुट को संग्रहीत कर रहे हैं, तो उन सभी स्थानों को दूर करना मुश्किल हो सकता है जिनमें आपका सॉफ़्टवेयर अंततः उपयोग किया जाएगा। उन सभी का समर्थन करने के लिए, शुरुआत से यूसीएस (यूनिकोड) का समर्थन करना सबसे अच्छा हो सकता है। हालाँकि, इसके लिए एक लागत है; कई पश्चिमी यूरोपीय पात्रों को अब एक के बजाय प्रति चरित्र दो बाइट्स की आवश्यकता होगी।

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


क्षमा करें दोस्त मैं अभी शुरुआत कर रहा हूँ और बस आपके स्पष्टीकरण की आवश्यकता है। तो, क्या मैं इस तरह से टकराव को समझ सकता हूं, यह वही है जो यह सुनिश्चित करता है कि प्रत्येक चरित्र (या तो लैटिन या चीनी है) को ठीक से पहचाना जाता है और संबंधित संलग्नक दिए जाते हैं। क्या वो सही है? मुझे आपके उत्तर की आशा है
Mirich

1
@ मिरिक नहीं, कोलाज वर्णों को कैसे सॉर्ट करना है, इसके बारे में जानकारी है। दुनिया के विभिन्न क्षेत्र अलग-अलग तरीकों से पात्रों को क्रमबद्ध करना पसंद करते हैं।
इरिकसन

3

मैं उपयोग करने का सुझाव देता हूं utf8mb4_unicode_ci, जो कि छंटाई और तुलना के लिए यूनिकोड मानक पर आधारित है, जो बहुत विस्तृत भाषाओं में सटीक रूप से सॉर्ट करता है।


3
ओपी से: "मैं दोनों के स्पष्टीकरण के लिए पूछ रहा हूं और उन्हें कैसे चुनना है"
दान एस्पराजा

1
@simhumileco, माफ करना यार मैं अभी शुरुआत कर रहा हूं और बस आपके स्पष्टीकरण की जरूरत है। तो, क्या मैं इस तरह से टकराव को समझ सकता हूं, यह वही है जो यह सुनिश्चित करता है कि प्रत्येक चरित्र (या तो लैटिन या चीनी है) को ठीक से पहचाना जाता है और संबंधित संलग्नक दिए जाते हैं। क्या वो सही है? मुझे आपके उत्तर की आशा है
Mirich

1
@ मिरीच यह सब इस बात पर निर्भर करता है कि आप अन्य स्थानों पर किस एन्कोडिंग का उपयोग करते हैं, यदि आप UTF-8डेटाबेस के बाहर किसी सिस्टम में एन्कोडिंग का उपयोग करते हैं, तो डेटाबेस में सब कुछ ठीक से लिखा जाना चाहिए यदि आप MySQLutf8mb4 में उपयोग करते हैं । जब MySQL में विशिष्ट वर्णों के लिए पाठ को छाँटने, तुलना करने और बदलने के सही संचालन की बात आती है , तो सही समाधान खोजना मुश्किल है, लेकिन निश्चित रूप से बेहतर है , लेकिन इसकी कमियां भी हैं। कृपया पढ़ें: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html*_unicode_ci*_general
simhumileco
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.