2013-07-08 10 views
11

मेरे पास एक सारणी है जो UTF-8- default संयोजन का उपयोग करती है।स्थानांतरित कर सकते हैं() उच्चारण असंवेदनशील (é = ई) बनाया जा सकता है?

मैं इस तालिका में किसी स्तंभ company जो इस मूल्य Café Rouge

है जब मैं जैसी क्वेरी करना कहा जाता है:

select * from company where name ='Cafe Rouge' 

यह इस कंपनी को सूचीबद्ध करता है, क्योंकि यह चरित्र é =e व्यवहार करता है लेकिन जब मैं का उपयोग करें प्रतिस्थापन आदेश, यह ée के रूप में नहीं मानता है।

तो,

select replace('Café Rouge','e','z') 

मुझे देता है 'Café Rougz' यानी यह z साथ é को प्रतिस्थापित नहीं करता।

कोई सुझाव सराहनीय

+2

मुझे यकीन नहीं है कि यह व्यवहार बदला जा सकता है - 'REPLACE() 'शायद बाइनरी तुलना कर रहा है। क्या यह आसानी से 'é' को प्रतिस्थापित करने का विकल्प नहीं है? –

+1

आपको 'é' को बदलने की आवश्यकता क्यों है? आपको संभवतः नया कॉलम 'company_normalized' बनाना चाहिए जहां आप बिना किसी उच्चारण के मूल्य डालते हैं, सामान्यीकृत स्पेस इत्यादि के साथ ट्रिम किए जाते हैं और फिर आप सामान्यीकृत संस्करण का उपयोग करते हैं जहां यह सहायक है, और असली कंपनी का नाम अन्यथा ... – sasjaq

+0

नहीं :(यह एक नहीं है विकल्प क्योंकि ऐसे कई वर्ण हो सकते हैं जो समस्या का कारण बनेंगे। साथ ही मैं अपनी तालिका को द्विआधारी संयोजन में नहीं बदल सकता क्योंकि हम वर्तमान में हर जगह केस असंवेदनशीलता का उपयोग कर रहे हैं और इसे बाइनरी में बदलना मतलब विभिन्न स्थानों पर परिवर्तन होगा। – Jeets

उत्तर

0

मुझे नहीं लगता कि आप ऐसा कर सकते हैं होगा। एक सुरक्षित शर्त केवल उन विशेष पात्रों पर प्रतिस्थापन करना होगा।

1

मुझे लगता है कि आप जो अच्छी चीजें कर सकते हैं, उनमें से एक दूसरा स्तंभ बनाए रखता है जो इन तारों को सामान्य रूप में रखता है; उदाहरण के लिए, इस कॉलम में "कैफे रूज" की बजाय "कैफे रूज" होगा। आप अपनी क्वेरी में असाधारण पात्रों को प्रोजेक्ट कर सकते हैं और उसके बाद क्वेरी के लिए सामान्य फॉर्म कॉलम का उपयोग कर सकते हैं।

0

आप कैफे रूज पर चयन क्यों नहीं करते हैं, और प्रत्येक लौटाए गए परिणामों पर वांछित कॉलम को प्रतिस्थापित करते हैं?

1

की जगह करने से पहले ASCII को name स्तंभ कन्वर्ट करने के लिए

SELECT REPLACE(CONVERT(name USING ascii), 'e', 'z') 

की कोशिश करो।

+0

मैंने इसके बारे में भी सोचा, लेकिन यह डेटा को नष्ट कर देगा और इसलिए बेकार होने की संभावना है। कल्पना करें 'कैफे Üntenbärger' -> यह' कैफज़ Untenbarger ' –

+1

खत्म हो जाएगा, लेकिन यदि आप तुलना के लिए' नाम 'डेटा के एक अलग संस्करण का उपयोग करना चाहते हैं, तो आप प्रतिस्थापित संस्करण को उपनाम के साथ लोड कर सकते हैं ताकि मूल' नाम ' भी उपलब्ध होगा। यदि आप अपने इरादे को अधिक स्पष्ट रूप से समझाते हैं तो यह सहायक होगा। –

+0

मुझे आपका अंक मिलता है, लेकिन आप mySQL में तुलना कैसे करेंगे? मुझे नहीं लगता कि यह संभव है। (आपको ऐसा करने के लिए एक स्क्रिप्टिंग भाषा की आवश्यकता होगी।) –

0

आपको इसे mySQL के बाहर करने की आवश्यकता होगी।

रूप CONVERT() का उपयोग कर @Christian द्वारा दिखाए आप MySQL के अंदर स्ट्रिंग को सामान्य कर सकते हैं, लेकिन यह किसी भी अन्य गैर- ASCII वर्ण वर्तमान को नष्ट कर देगा:

Bürgercafé Römer 

से

Burgercafz Romer 

वर्ण हो जाएंगे सिरिलिक या चीनी जैसे अन्य चरित्र सेट पूरी तरह मिटा दिए जाएंगे।

आपका सबसे अच्छा सर्वश्रेष्ठ या तो उन सभी वर्णों को प्रतिस्थापित करना है जिन्हें आप प्रतिस्थापित करना चाहते हैं।

replace('Café Rouge','e','z') 
replace('Café Rouge','é','z') 
replace('Café Rouge','è','z') 

ऐसा करने के लिए बिल्कुल आप क्या चाहते हैं, तो आप PHP जैसे एक प्रोग्रामिंग भाषा में हर स्ट्रिंग लोड करने के लिए होगा।

वहाँ, आप निम्न कर सकता है:

  1. लोड डेटाबेस से स्ट्रिंग; सुनिश्चित करें कि यह UTF-8

  2. स्प्लिट अपने पात्रों में स्ट्रिंग (multibyte पात्रों के बारे में पता होना - का उपयोग mb_split()) है हर किरदार

  3. के माध्यम से

  4. वॉक iconv($character, "UTF-8", "ASCII//TRANSLIT");

  5. का उपयोग कर चरित्र सामान्यीकृत करें

    यदि सामान्यीकृत वर्ण e में परिणाम देते हैं, तो आप जानते हैं कि आपको इसे अपनी स्ट्रिंग में बदलना होगा।

  6. परिवर्तित स्ट्रिंग को डेटाबेस में वापस लिखें।

हालांकि, यह एक छोटी सी चीज़ की तरह दिखने के लिए बहुत परेशानी की तरह दिखता है। क्या आपको वाकई यकीन है कि यह जरूरी है?

+0

धन्यवाद, मैं कोशिश करूँगा। – Jeets

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