আমি কীভাবে লাইক ওয়াইল্ডকার্ড ব্যবহার করে একটি কলামে (কেস-সংবেদনশীল) অনুসন্ধান করতে পারি?


289

আমি কিছু আশেপাশে তাকিয়েছিলাম এবং এখানে যা হয় তার পরে আমার কী ছিল তা খুঁজে পেলাম না।

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

এটি দুর্দান্ত কাজ করে তবে গাছটির নাম এলম বা ইএলএম ইত্যাদি যদি না হয় ...

আমি কীভাবে এসকিউএল কেসটিকে এই ওয়াইল্ড কার্ড অনুসন্ধানের জন্য সংবেদনশীল করব?

আমি মাইএসকিউএল 5 এবং অ্যাপাচি ব্যবহার করছি।


3
আপনি যদি এই পৃষ্ঠায় হোঁচট খেয়ে পড়ে থাকেন তবে আপনার মাইএসকিএল সেটিংস এলম বা ইএলএম-এর জন্য এই ক্যোয়ারিতে কাজ করে এবং আপনি এটি সংবেদনশীল হতে চান না, BINARYযেমন এখানে দেখুন: স্ট্যাকওভারফ্লো
প্রশ্নগুলি

এটি ক্ষেত্র / টেবিলের জোটের উপর নির্ভর করে না? 'ut8_general_CI'
ইউসু আলেয়ুব

এটি সিকুলাইজ নোড কোয়েরি কীভাবে ব্যবহার করবেন?
অ্যাশ

মাইএসকিউএলগুলি likeডিফল্টরূপে কেস-সংবেদনশীল হওয়া উচিত।
মার্কো বোনাচি

উত্তর:


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
টেবিল গাছগুলি পরিবর্তিত করুন কালাম শিরোনাম ভর্চার (…) এটি সর্বোত্তম উপায় বলে মনে হচ্ছে, অনেক ধন্যবাদ ... এসকিউএলটি কাজটি করুক
ডেভিড মোর

10
বন্ধুত্বপূর্ণ অনুস্মারক যে এটি একটি মাইএসকিএল উত্তর। আপনি যদি PostgreSQL ব্যবহার করছেন তবে উপরের প্রশ্নের সমাধান হ'ল আইলাইক।
স্টিভ

2
@ রাজরনওয়াল: আপনার প্রশ্নটি প্রশ্ন হিসাবে পোস্ট করুন, মন্তব্য নয় not ধন্যবাদ।
কাসনসুই

1
এটি যতক্ষণ না সঠিক উত্তর, আপনার মূল কোলেটটি সাধারণ ছিল, বিন নয়।
গ্রীনল্ডম্যান

261

আমি সর্বদা নিম্ন ব্যবহার করে এটি সমাধান করেছি:

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

47
এবং সূচি ব্যবহারটি লুণ্ঠন করুন
আপনার সাধারণ সংবেদন

3
মাইএসকিউএল 5 এর কি আইলিকে অপারেটর রয়েছে?
লুক মোরার

27
যদিও %% অনুসন্ধানের জন্য এটি কোনওভাবেই বিবেচনা করে না :)
আপনার প্রচলিত সংবেদন

5
@Col। - স্বীকার করা যায় যে এটি সূচিবদ্ধ কলামগুলির জন্য আদর্শের চেয়ে কম তবে এটি ইতিমধ্যে কার্যকর এমন কাঠামোর জন্য কাজ করবে। আমি এটিও পেয়েছি যে কেস-সংবেদনশীল অনুসন্ধানগুলি প্রায়শই কলামগুলিতে থাকে যা যাইহোক সূচিযুক্ত নয়।
cwallenpoole

1
ডিফল্ট জোট ইতিমধ্যে সিআই is সুতরাং, আসল সমস্যাটি এই বিশেষ প্রশ্নে নয়। তবে এটি এখনও নিখুঁত এসও-স্টাইলের উত্তর।
আপনার কমন সেন্স

48

কেস সংবেদনশীলতা কলাম / টেবিল / ডাটাবেস কলেশন সেটিংস সংজ্ঞায়িত করা হয়। আপনি নিম্নলিখিত পদ্ধতিতে একটি নির্দিষ্ট কোলেশনের অধীনে ক্যোয়ারীটি করতে পারেন:

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

এই ক্ষেত্রে.

( utf8_general_ciযে কোনও কোলেশন আপনি দরকারী বলে প্রতিস্থাপন করুন )। _ciঘোরা ক্ষেত্রে অসংবেদী


1
মাইএসকিউএল 5.6 এ আমি এরর 1232 (এইচওয়াই 1000) পেয়েছি: অজানা কোলেশন: 'utf_general_ci' । আমি অনুমান করব যে এই কলেজটি মাইএসকিউএল থেকে সরানো হয়েছে? utf8_general_ciভাল কাজ করে, যদিও।
মার্ক আমেরিকা

1
একই সমস্যা ছিল। আপনাকে হয় ঠিক করতে হবে COLLATEবা এর মতো একটি সহজ কৌশল করতে হবে ( LOWER()তুলনার আগে আপনার উভয় স্ট্রিং)
মেনেলাওস কোটসোল্লারিস

মাইএসকিউএল 5.6+ বা মারিয়াডবি 10+ এ আপনার অবস্থার আগে আপনাকে কেবল প্রশিক্ষণ সরবরাহ করতে হবে। সুতরাং এটি কাজ করে:SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
স্ট্যামস্টার

41

এটি একটি সাধারণ লাইক কোয়েরির উদাহরণ:

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

এখন, লোয়ার () ফানক ব্যবহার করে কেস-সংবেদনশীল:

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

3
আসলে এটি একটি দুর্দান্ত সমাধান বিশেষত যখন আপনি COLLATEফর্ম্যাট সংক্রান্ত সমস্যার মুখোমুখি হন
মেনেলাওস কোটসোল্লারিস

27

সহজভাবে ব্যবহার করুন:

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

বা ব্যবহার করুন

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

উভয় ফাংশন একই কাজ করে


15

আমি এমন কিছু করছি

ছোট হাতের মান এবং মাইএসকিউএল এ মানগুলি বাকী কাজগুলি করে

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

এবং মাইএসকিউএল পিডিও বিকল্পের জন্য:

        $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.org/docs/current/static/funitions-matching.html
মার্টিন টর্নয়েজ

ইতিমধ্যে উল্লিখিত হিসাবে, প্রশ্নটি মাইএসকিউএল সম্পর্কে ছিল এবং উত্তরটি পোস্টগ্রাইএসকিউএল সম্পর্কে এবং নিশ্চিত যে নরক মাইএসকিউএল নিয়ে কাজ করে না। আমি এটিকে ভোট দিচ্ছি না তবে ভাবতে পারি না যে আপ-ভোটগুলি কোথা থেকে এসেছে ...
রৌপ্যদর্শী

5

ব্যবহার ILIKE

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

এটা আমার জন্য কাজ করে !!


9
মাইএসকিউএল আইলিকে সমর্থন করে না
তাতারচলা

3
এটি পোস্টগ্রেএসকিউএল এর জন্য কাজ করে, প্রশ্নটি মাইএসকিউএল সম্পর্কিত ছিল।
টেল্মো ট্রুপার

4

আপনার ALTERকোনও টেবিলের দরকার নেই । SELECTআপনি ওয়াইল্ডকার্ডটি ব্যবহার করতে চান এমন প্রকৃত ক্যোয়ারির আগে কেবল নীচের প্রশ্নগুলি ব্যবহার করুন:

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

2
এটি খুব আন্ডাররেটেড মন্তব্য is এটি প্রশ্নটিকে সবচেয়ে সাধারণভাবে সম্বোধন করে। আমি মনে করি যে পরিবর্তিত টেবিল বাক্য গঠনটিও গুরুত্বপূর্ণ, কারণ প্রশ্নটি তুলনাটি কেবলমাত্র একটি কলামে সীমাবদ্ধ থাকতে পারে।
ব্রায়ান ক্রিসম্যান

1

মাইএসকিএল ৫.৫-তে ভাল যেমন অপারেটর সংবেদনশীল হয় ... সুতরাং যদি আপনার ভ্যাল এলম বা ইএলএম বা এলম বা ইএলএম বা অন্য কোনও হয় এবং আপনি '% এলম%' এর মতো ব্যবহার করেন তবে এটি সমস্ত মিলের মানগুলি তালিকাভুক্ত করবে।

আমি MySQL এর পূর্ববর্তী সংস্করণগুলি সম্পর্কে বলতে পারি না।

যদি আপনি ওরাকলে যান, যেমন কেস-সংবেদনশীল হিসাবে কাজ করুন, সুতরাং আপনি যদি '% এলম%' এর মতো টাইপ করেন তবে এটি কেবল এটির জন্য যাবে এবং বড় হাতের অক্ষরকে উপেক্ষা করবে ..

অদ্ভুত, তবে এটি এইভাবে :)


এটি সম্পূর্ণ সত্য নয়। এটি কেবল তখনই কাজ করে যদি কোলেশন সেট করা থাকে *_ci, যা "কেস সংবেদনশীল" হিসাবে দাঁড়িয়েছে। যেহেতু এটি সমস্ত সমর্থিত অক্ষর সেটগুলির জন্য ডিফল্ট হতে পারে ( show character set;এটি যাচাই করার জন্য) - উত্তরটি আংশিক সত্য :-) কেবল কারণটিই ভুল। এটি অপারেটর নয় যে এটি সংবেদনশীল is
সিলভার্ডার

হ্যাঁ আমি আপনার সাথে একমত এটি চরিত্রের উপর নির্ভর করে এবং এখনও যদি আপনি * _ci অক্ষরের সাথে প্রযোজনা করেন তবে ক্লজ করার আগে বাইনারি ব্যবহার করা কেবলমাত্র বিকল্প
ব্যবহারকারী 21546

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

গ্যালারীটি টেবিলের নাম, নামটি টেবিলের কলাম,
ব্যবহারকারী 4189641

2
এই ইচ্ছার সাহায্যের অন্যদের ভবিষ্যতে - কিছু explnataion আপনার কোড দেখানো যোগ করুন এটি কী এবং কিভাবে এটা সাহায্য করে
কলা আমাদের ম্যান

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";

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.