2012-06-12 19 views
5

मुझे पता है कि एसएफ पर बहुत सारे प्रश्न हैं, लेकिन मुझे लगता है कि मेरा एक नया प्रश्न वारंट करने के लिए काफी अलग है। मेरे पास एक सारणी है जिसमें utf8_unicode_ci के साथ utf8 के रूप में एक कॉलम है। इस कॉलम पर एक भाषा कोड चिह्नित करने वाले दूसरे कॉलम के साथ इसकी एक अनूठी कुंजी भी है। कॉलम में डेटा कई अलग-अलग स्क्रिप्ट्स (लैटिन के साथ विभिन्न उच्चारण, चीनी और रूसी के साथ) में है।MySQL केस असंवेदनशील लेकिन एक्सेंट संवेदनशील यूटीएफ 8 अनन्य कुंजी

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

तो, उन सभी ने कहा, मुझे कुछ समाधान की आवश्यकता है जो इस कॉलम को मारने वाले कई मौजूदा प्रश्नों में डिफ़ॉल्ट केस संवेदनशीलता को प्रभावित नहीं करेगा, लेकिन मुझे उन शब्दों में जोड़ देगा जो केवल एक विशिष्ट द्वारा भिन्न हैं। विचार? अगर मुझे करना है तो मैं utf8_bin पर केवल अनन्य कुंजी बाधा को बदल दूंगा, लेकिन मैं नहीं चाहता क्योंकि मैं तालिका में दो चीजें कभी नहीं चाहता जो केवल मामले के अनुसार अलग हो।

उत्तर

0

एकमात्र चीज जिसे मैं सोच सकता हूं (आपकी आवश्यकताओं के अनुरूप एक संयोजन ढूंढने के बिना) एप्लिकेशन परत (MySQL के बाहर) में कुछ बदलना है जो भिन्नता का ख्याल रखेगा।

उदाहरण के लिए, चूंकि आपको मामले की परवाह नहीं है, इसलिए आप डेटाबेस में सभी पंक्तियों के मामले को कम करने के लिए प्रोग्रामेटिक रूप से कुछ कर सकते हैं। फिर collfation utf8_bin में बदलें।

फिर आप एप्लिकेशन में, डाटाबेस में प्रवेश करने से पहले सबकुछ को लोअरकेस में परिवर्तित कर सकते हैं (मुझे लगता है कि यह diacritic पात्रों को प्रभावित नहीं करेगा)। इस तरह, यदि आप कई मामलों में प्रवेश करने का प्रयास करते हैं, तो आपको अभी भी त्रुटियां मिलेंगी, आपको केवल तालिका में प्रवेश करने वाली पूर्व शर्त सामग्री में कोड की कुछ पंक्तियां बदलनी होंगी, और आपके पास डायक्रिटिक समस्या नहीं होगी।

+1

कुछ अपरकेस वर्णों में लोअरकेस समकक्ष नहीं है। कुछ में कई लोअरकेस समकक्ष होते हैं। यह एक गड़बड़ है। –

0

आपको फ्लैट टायर (पहिया को फिर से शुरू करने) को फिर से शुरू करने की आवश्यकता नहीं है।

utf8_spanish_ci (आधुनिक स्पेनिश) और utf8_spanish2_ci (पारंपरिक स्पेनिश)

ये अच्छी तरह से पता है कि एन और एन एक साथ इकट्ठा किया जाना चाहिए पर्याप्त भाषा जानते हैं:

MySQL में दो स्पेनिश भाषा collations हैं , लेकिन वह Ñ और N एन और ओ के बीच अलग-अलग अक्षर हैं। स्पेनिश में, Ñ वास्तव में एक अलग पत्र है, न कि उच्चारण।

अपना कॉलम collation utf8_spanish_ci पर सेट करें और सभी आपके इच्छित तरीके से काम करेंगे।

+0

धन्यवाद, लेकिन जैसा कि मैंने उल्लेख किया है, यह केवल स्पेनिश नहीं है जिसके बारे में मुझे चिंता है। विभिन्न भाषाओं के समूह में सामान है। – Eli

+0

हम्म। यूनिकोड collations का सपना देखने वाले लोग उत्कृष्ट भाषाविद हैं। यदि कोई सार्वभौमिक समाधान था जो सभी रोमन-वर्णमाला भाषाओं के लिए सही काम करता था तो वे इसे लागू कर देते थे। आपको अपने उपयोगकर्ता की भाषा के आधार पर कुछ भाषा संवेदनशील क्वेरीिंग करने की आवश्यकता हो सकती है। आप एक WHERE कथन में एक COLLATE क्लॉज रख सकते हैं। –

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