मैं LIKE वाइल्डकार्ड का उपयोग करके कॉलम में (केस-इनसेन्सिटिव) कैसे खोज सकता हूं?


289

मैंने कुछ इधर-उधर देखा और मुझे पता नहीं चला कि आखिर मैं यहाँ क्या कर रहा था।

SELECT * FROM trees WHERE trees.`title` LIKE  '%elm%'

यह ठीक काम करता है, लेकिन अगर पेड़ का नाम एल्म या ईएलएम आदि न हो ...

मैं इस वाइल्ड-कार्ड खोज के लिए SQL केस को असंवेदनशील कैसे बनाऊं?

मैं MySQL 5 और Apache का उपयोग कर रहा हूं।


3
यदि आप इस पृष्ठ पर ठोकर BINARY
खाते

क्या यह फील्ड / टेबल कोलेशन पर निर्भर नहीं है? जैसे 'ut8_general_CI'
Yousha Aleayoub

नोड क्वेरी का उपयोग कैसे करें?
आषाढ़

likeडिफ़ॉल्ट रूप से MySQL का केस असंवेदनशील होना चाहिए।
मार्को बोनासी

जवाबों:


281
SELECT  *
FROM    trees
WHERE   trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%'

दरअसल, यदि आप COLLATE UTF8_GENERAL_CIअपने कॉलम की परिभाषा में जोड़ते हैं, तो आप इन सभी तरकीबों को छोड़ सकते हैं: यह अपने आप काम करेगा।

ALTER TABLE trees 
 MODIFY COLUMN title VARCHAR(…) CHARACTER 
 SET UTF8 COLLATE UTF8_GENERAL_CI. 

यह इस स्तंभ पर किसी भी अनुक्रमणिका का पुनर्निर्माण करेगा, ताकि उन्हें '%' के बिना प्रश्नों के लिए उपयोग किया जा सके


34
दरअसल, यदि आप COLLATE UTF8_GENERAL_CIअपने कॉलम की परिभाषा में जोड़ते हैं, तो आप इन सभी तरकीबों को छोड़ सकते हैं: यह अपने आप काम करेगा। ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI। यह इस स्तंभ पर किसी भी अनुक्रमणिका का पुनर्निर्माण करेगा, ताकि उनका उपयोग '%' के बिना प्रश्नों के लिए किया जा सके।
क्वासोई

1
वैकल्पिक पेड़ पेड़ मोडी शीर्षक VARCHAR (…) यह सबसे अच्छा तरीका लगता है, बहुत बहुत धन्यवाद ... चलो काम करते हैं
डेविड मॉरो

10
दोस्ताना याद दिलाता है कि यह एक mysql जवाब है। यदि आप PostgreSQL का उपयोग कर रहे हैं, तो ILike उपरोक्त प्रश्न का समाधान है।
स्टीव

2
@RajanRawal: कृपया अपना प्रश्न एक प्रश्न के रूप में पोस्ट करें, टिप्पणी नहीं। धन्यवाद।
क्वासोनी

1
यह सही उत्तर है जब तक कि आपका मूल कोलाज सामान्य था, बिन नहीं।
ग्रीनल्डमैन

261

मैंने हमेशा इसे कम उपयोग करके हल किया है:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'

47
और खराब इंडेक्स का उपयोग करें
आपका कॉमन सेंस

3
क्या MySQL 5 में ILIKE ऑपरेटर है?
ल्यूक मौरर

27
हालाँकि %% की खोज के लिए यह कोई मायने नहीं रखता है :)
योर कॉमन सेंस

5
@Col। - जाहिर है, यह अनुक्रमित स्तंभों के लिए आदर्श से कम है, लेकिन यह एक संरचना के लिए काम करेगा जो पहले से ही है। मैंने यह भी पाया है कि केस-असंवेदनशील खोजें उन कॉलमों पर अधिक होती हैं जिन्हें वैसे भी अनुक्रमित नहीं किया जाता है।
cwallenpoole

1
डिफ़ॉल्ट टकराव पहले से ही CI है। तो, असली समस्या इस विशेष प्रश्न में नहीं है। लेकिन यह अभी भी सही एसओ-शैली का जवाब है।
आपका कॉमन सेंस

48

केस सेंसिटिविटी को कॉलम / टेबल / डेटाबेस कोलेशन सेटिंग्स में परिभाषित किया गया है। आप निम्नलिखित तरीके से एक विशिष्ट टकराव के तहत क्वेरी कर सकते हैं:

SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci

उदाहरण के लिए।

( utf8_general_ciजो भी कोलाज आपको उपयोगी लगता है उसके साथ बदलें )। _ciके लिए खड़ा केस संवेदी


1
MySQL 5.6 में मुझे ERROR 1273 (HY000) मिलता है: अज्ञात टकराव: 'utf_general_ci' । मुझे लगता है कि इस टकराव को MySQL से हटा दिया गया है? utf8_general_ciहालांकि ठीक काम करता है।
मार्क एमी

1
एक ही मुद्दा था। आपको या तो अपने को ठीक करना होगा COLLATEया इस तरह से एक सरल चाल LOWER()
चलनी होगी

MySQL 5.6+ या MariaDB 10+ में आपको अपनी स्थिति से पहले केवल COLLATE निर्देश की आपूर्ति करनी होगी। तो यह काम करता है:SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
स्ट्रैमस्टर

41

यह एक साधारण LIKE क्वेरी का उदाहरण है:

SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'

अब, केस-असंवेदनशील LOWER () फंक का उपयोग कर:

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')

3
वास्तव में यह एक बहुत अच्छा समाधान है, खासकर जब आपको COLLATEप्रारूप के मुद्दों का सामना करना पड़ रहा है
Menelaos Kotsollaris

27

बस उपयोग करें:

"SELECT * FROM `trees` WHERE LOWER(trees.`title`) LIKE  '%elm%'";

या उपयोग करें

"SELECT * FROM `trees` WHERE LCASE(trees.`title`) LIKE  '%elm%'";

दोनों कार्य समान हैं


15

मैं ऐसा कुछ कर रहा हूं।

लोअरकेस और MySQL में मान प्राप्त करना बाकी काम करता है

    $string = $_GET['string'];
    mysqli_query($con,"SELECT *
                       FROM table_name
                       WHERE LOWER(column_name)
                       LIKE LOWER('%$string%')");

और MySQL PDO वैकल्पिक के लिए:

        $string = $_GET['string'];
        $q = "SELECT *
              FROM table_name
              WHERE LOWER(column_name)
              LIKE LOWER(?);";
        $query = $dbConnection->prepare($q);
        $query->bindValue(1, "%$string%", PDO::PARAM_STR);
        $query->execute();

6

मुझे लगता है कि यह क्वेरी असंवेदनशील खोज करेगी:

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

1
मुझे अपने प्रश्नों में ILIKE का उपयोग करते समय Mysql 5.5 पर सिंटैक्स त्रुटि मिलती है
स्टील ब्रेन

18
यह केवल PostgreSQL के लिए काम करता है; MySQL नहीं। postgresql.org/docs/current/static/functions-matching.html
मार्टिन टूरनोइज

जैसा कि पहले ही उल्लेख किया गया था, प्रश्न MySQL के बारे में था और उत्तर PostgreSQL के बारे में है और निश्चित रूप से नरक MySQL के साथ काम नहीं करता है। मैं इसे डाउन-वोट नहीं करता, लेकिन यह सोचकर मदद नहीं कर सकता कि अप-वोट कहां से आए ...
18'18

5

उपयोग ILIKE

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

यह मेरे लिए काम किया !!


9
MySQL ILIKE का समर्थन नहीं करता है ।

3
यह PostgreSQL के लिए काम करता है, सवाल MySQL से संबंधित था।
ट्रूपर

4

आपको ALTERकिसी तालिका की आवश्यकता नहीं है । SELECTवाइल्डकार्ड का उपयोग करने के लिए वास्तविक क्वेरी से पहले बस निम्नलिखित प्रश्नों का उपयोग करें:

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;

2
यह एक बहुत ही कमिटेड टिप्पणी है। यह प्रश्न को सबसे आम तौर पर संबोधित करता है। मुझे लगता है कि परिवर्तन तालिका वाक्यविन्यास भी महत्वपूर्ण है, क्योंकि प्रश्न केवल एक स्तंभ तक सीमित तुलना को चाह सकता है।
ब्रायन क्रिसमैन

1

mysql 5.5 में अच्छी तरह से, ऑपरेटर असंवेदनशील है ... इसलिए यदि आपका vale elm या ELM या Elm या eLM या कोई अन्य है, और आप '% elm%' की तरह उपयोग करते हैं, तो यह सभी मिलान मूल्यों को सूचीबद्ध करेगा।

मैं mysql के पुराने संस्करणों के बारे में नहीं कह सकता।

यदि आप ओरेकल में जाते हैं, जैसे केस-संवेदी के रूप में काम करते हैं, इसलिए यदि आप '% एल्म%' टाइप करते हैं, तो यह केवल इसके लिए जाएगा और अपरकेस को अनदेखा करेगा।

अजीब है, लेकिन यह है कि यह कैसे है :)


यह पूरी तरह सच नहीं है। यह उस तरह से काम करता है जब टकराव को सेट किया जाता है *_ci, जो "केस असंवेदनशील" के लिए खड़ा होता है। जैसा कि सभी समर्थित वर्ण सेटों ( show character set;इसे जांचने के लिए मुद्दा ) के लिए डिफ़ॉल्ट होना चाहिए - उत्तर आंशिक रूप से सही है :-) केवल कारण गलत है। यह संचालक नहीं है जो केस असंवेदनशील है, यह डिफ़ॉल्ट कोलाजेशन है।
सिल्वरड्र

हाँ मैं आपसे सहमत हूँ। यह चरित्र पर निर्भर करता है और फिर भी यदि आप * _ci चरित्र के साथ उत्पादन में हैं तो केवल विकल्प बाइनरी का उपयोग करना है जहां क्लॉज़ से पहले
यूज़र 21546

1
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 

गैलरी तालिका-नाम है, नाम तालिका में स्तंभ है,
user4189641

2
कृपया अपने कोड के कुछ एक्सप्लानेटेशन को जोड़ें कि यह क्या करता है और यह कैसे मदद करता है - यह भविष्य में दूसरों की मदद करेगा
हमारे आदमी केले में

0

आपको अपनी तालिकाओं के लिए उचित एन्कोडिंग और कोलाज सेट करना होगा।

तालिका एन्कोडिंग को वास्तविक डेटा एन्कोडिंग को प्रतिबिंबित करना चाहिए। आपका डेटा एन्कोडिंग क्या है?

तालिका एन्कोडिंग देखने के लिए, आप एक क्वेरी चला सकते हैं SHOW CREATE TABLE tablename


0

जब मैं असंवेदनशील केस खोज विकसित करना चाहता हूं, तो मैं हमेशा तुलना करने से पहले हर स्ट्रिंग को लोअर केस में बदल देता हूं


0

आप निम्न विधि का उपयोग कर सकते हैं

 private function generateStringCondition($value = '',$field = '', $operator = '', $regex = '', $wildcardStart = '', $wildcardEnd = ''){
        if($value != ''){
            $where = " $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd' ";

            $searchArray = explode(' ', $value);

            if(sizeof($searchArray) > 1){

                foreach ($searchArray as $key=>$value){
                    $where .="$operator $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd'";
                }

            }

        }else{
            $where = '';
        }
        return $where;
    }

इस विधि का उपयोग नीचे की तरह करें

   $where =  $this->generateStringCondition($yourSearchString,  'LOWER(columnName)','or', 'like',  '%', '%');
  $sql = "select * from table $where";

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.