2013-01-03 28 views
9

मैं शराब के नाम, जिनमें से कई को शामिल लहजे (लेकिन एक समान तरीके से नहीं है, और इसलिए समान मदिरा के साथ या उसके उच्चारण के बिना प्रवेश किया जा सकता है)MySQL regexp क्वेरी - लहजे असंवेदनशील खोज

के एक डेटाबेस क्वेरी करने के लिए देख रहा हूँ

बुनियादी क्वेरी इस तरह दिखता है:

SELECT * FROM `table` WHERE `wine_name` REGEXP '[[:<:]]Faugères[[:>:]]' 

जो शीर्षक में 'Faugères' के साथ प्रविष्टियों वापस आ जाएगी, लेकिन 'Faugeres'

SELECT * FROM `table` WHERE `wine_name` REGEXP '[[:<:]]Faugeres[[:>:]]' 

विपरीत है। जैसे

मैंने सोचा था कुछ:

SELECT * 
FROM `table` 
WHERE `wine_name` REGEXP '[[:<:]]Faug[eèêéë]r[eèêéë]s[[:>:]]' 

चाल कर सकते हैं, लेकिन यह केवल लहजे के बिना परिणाम देता है।

फ़ील्ड को utf8_unicode_ci के रूप में एकत्रित किया गया है, जो मैंने पढ़ा है, यह है कि यह कैसे होना चाहिए।

कोई सुझाव ?!

+0

मुझे एक ही समस्या थी। यहां मेरा विषय देखें: http://stackoverflow.com/questions/33722136/how-to-search-string-using-entity-framework-with-contains-and-with-accent-insen/34047990#34047990 – Dan

उत्तर

4

You're out of luck:

चेतावनी

बाइट के लिहाज से फैशन में regexp और RLIKE ऑपरेटरों काम करते हैं, तो वे नहीं मल्टी-बाइट सुरक्षित हैं और मल्टी-बाइट साथ अप्रत्याशित परिणाम उत्पन्न कर सकते चरित्र सेट इसके अलावा, ये ऑपरेटर द्वारा अपने बाइट मानों से वर्णों की तुलना करते हैं और उच्चारण किए गए वर्णों की तुलना के बराबर नहीं की जा सकती है, भले ही एक दिया गया संयोजन उन्हें बराबर मानता हो।

[[:<:]] और [[:>:]] regexp ऑपरेटरों शब्द सीमाओं के लिए मार्कर कर रहे हैं।

SELECT * 
FROM `table` 
WHERE wine_name = 'Faugères' 
    OR wine_name LIKE 'Faugères %' 
    OR wine_name LIKE '% Faugères' 

आप इसे पूरी तरह से बराबर नहीं है क्योंकि मैं रिक्त स्थान के लिए शब्द सीमा की अवधारणा पर पाबंदी लगा रखी देख सकते हैं: निकटतम आप LIKE ऑपरेटर के साथ प्राप्त कर सकते हैं इस लाइन पर कुछ न कुछ है। अन्य सीमाओं के लिए और खंड जोड़ना एक गड़बड़ होगी।

आप पूर्ण टेक्स्ट खोजों का भी उपयोग कर सकते हैं (हालांकि यह वही नहीं है) लेकिन आप इनो डीबी टेबल (अभी तक) में पूर्ण टेक्स्ट इंडेक्स को परिभाषित नहीं कर सकते हैं।

आप भाग्य से बाहर निश्चित रूप से कर रहे हैं :)

+0

ओच। .. - ठीक है, तो अगर मैं स्विच करता हूं: जहां 'wine_name' LIKE'% Faugeres% ' कोई नकारात्मकता है? मुझे याद नहीं है कि हम क्यों शुरू करने के लिए REGEXP का उपयोग कर रहे थे, लेकिन मुझे लगता है कि यह पूरे शब्दों को खोजने के साथ करना था और शब्दों के भीतर तार नहीं था, जो उपर्युक्त कथन करेगा ... – freestate

+0

यह समाधान इतना अच्छा नहीं हो सकता है क्योंकि यह शब्द काम नहीं करेगा यदि शब्द के बाद या उससे पहले के अन्य पात्र हैं, जैसे: 'फॉगेरेस।' 'फागेरेस!' 'फागेरेस?' '(फेगेरेस' और कई अन्य विविधताएं मैं समीकरण की तलाश में हूं: शब्द सीमाओं का उपयोग करने के लिए REGEXP लेकिन उच्चारण-असंवेदनशील। – steps

1

utf8_general_ci लहजे/कोई लहजे में कोई अंतर नहीं देखते हैं जब छँटाई। शायद यह खोजों के लिए भी सच है। इसके अलावा, REGEXP को LIKE में बदलें। REGEXP द्विआधारी तुलना करता है।

0

ठीक है, मैंने कुछ और खोजते समय बस इस प्रश्न पर ठोकर खाई।

यह सच है।

SELECT 'Faugères' REGEXP 'Faug[eèêéë]+r[eèêéë]+s'; 

उम्मीद है कि यह मदद करता है।

'+' जोड़ना अक्षरों की एक या अधिक घटनाओं को देखने के लिए regexp बताता है।

0

इस समस्या को हल करने के लिए, मैंने बाइनरी कीवर्ड या लैटिन 1 वर्ण सेट का उपयोग करने सहित विभिन्न चीजों की कोशिश की लेकिन इसका कोई फायदा नहीं हुआ।
अंत में, यह देखते हुए कि यह ने MySQL बग है, मैं é और ई वर्ण,

इस तरह जगह समाप्त हो गया:

SELECT * 
FROM `table` 
WHERE replace(replace(wine_name, 'é', 'e'), 'è', 'e') REGEXP '[[:<:]]Faugeres[[:>:]]' 
3

क्योंकि regexp और RLIKE बाइट उन्मुख रहे हैं, आप की कोशिश की है:

SELECT 'Faugères' REGEXP 'Faug(e|è|ê|é|ë)r(e|è|ê|é|ë)s'; 

यह कहता है कि इनमें से एक अभिव्यक्ति में होना चाहिए। ध्यान दें कि मैंने प्लस (+) का उपयोग नहीं किया है क्योंकि इसका मतलब एक या अधिक है। चूंकि आप केवल एक चाहते हैं कि आपको प्लस का उपयोग नहीं करना चाहिए।

0

मुझे एक ही समस्या थी जिसमें निम्नलिखित रिकॉर्डों में से प्रत्येक मिलान मिलान करने का प्रयास किया गया था: 'copropriété', 'copropriete', 'COPROPRIÉTÉ', 'Copº? T?'

REGEXP 'copropri.{1,2}t.{1,2} मेरे लिए काम किया। असल में, .{1,2} प्रत्येक मामले में काम करना चाहिए, चरित्र 1 या 2 बाइट एन्कोडेड है।

स्पष्टीकरण: https://dev.mysql.com/doc/refman/5.7/en/regexp.html

चेतावनी बाइट के लिहाज से फैशन में
regexp और RLIKE ऑपरेटरों काम करते हैं, ताकि वे सुरक्षित multibyte नहीं कर रहे हैं और multibyte चरित्र सेट के साथ अनपेक्षित परिणाम हो सकता है। इसके अलावा, ये ऑपरेटर अपने बाइट मानों से वर्णों की तुलना करते हैं और उच्चारण वर्णों की तुलना बराबर की तुलना नहीं की जा सकती है, भले ही दिए गए संयोजन उन्हें समान मानते हैं।