WHERE क्लॉज में केस सेंसिटिव सर्च कैसे करें?


21

मैं SQL क्वेरी में केस संवेदी खोज चाहता हूं। लेकिन डिफ़ॉल्ट रूप से, MySQL स्ट्रिंग्स के मामले पर विचार नहीं करता है।

SQL क्वेरी में केस संवेदी खोज करने का कोई विचार?

जवाबों:


22

डिफ़ॉल्ट रूप से, MySQL स्ट्रिंग्स के मामले पर विचार नहीं करता है

यह बिल्कुल सच नहीं है। जब भी आप create databaseMySQL में होते हैं, डेटाबेस / स्कीमा में एक कैरेक्टर सेट और एक कोलेशन होता है। प्रत्येक वर्ण सेट में एक डिफ़ॉल्ट टकराव है; अधिक जानकारी के लिए यहाँ देखें।

चरित्र सेट के लिए डिफ़ॉल्ट टकराव latin1, जो latin1_swedish_ciकेस-असंवेदनशील होता है।

आप उदाहरण के लिए केस-संवेदी कोलेशन चुन सकते हैं, latin1_general_cs( MySQL व्याकरण ):

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

इससे समूह और समानता जैसी चीजों पर प्रभाव पड़ता है। उदाहरण के लिए,

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

केस-संवेदी डेटाबेस में, हम प्राप्त करते हैं:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC   |        1 |
| aBc   |        1 |
| abC   |        1 |
| abc   |        1 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
+----+-------+

एक मामले में असंवेदनशील डेटाबेस में, हमें मिलता है:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc   |        4 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

ध्यान दें कि आप किसी क्वेरी के भीतर से टकराव को भी बदल सकते हैं । उदाहरण के लिए, केस- संवेदी डेटाबेस में, मैं कर सकता हूं

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

13

आपको हमेशा अपने प्रश्न के साथ बताना चाहिए कि आप किस MySQL के संस्करण का उपयोग कर रहे हैं, क्योंकि MySQL निरंतर विकास में है।

ठीक है, अपने सवाल पर वापस:

MySQL में स्ट्रिंग कार्यों ताकि आप किसी भी कार्य के इस्तेमाल कर सकते हैं, केस संवेदी हमेशा से रहे हैं LOCATE, POSITIONया INSTR

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

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

नियमित अभिव्यक्ति ( RLIKEया REGEXP) के साथ मेल खाने वाला पैटर्न हमेशा नवीनतम 3.23.4 को छोड़कर MySQL के सभी संस्करणों के लिए संवेदनशील होता है।

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

SELECT phone FROM user WHERE user_name REGEXP 'term';

सामान्य तुलना (=) और एसक्यूएल पैटर्न मिलान ( LIKE) दोनों के लिए व्यवहार उन क्षेत्रों पर निर्भर करता है जो इसमें शामिल हैं:

ए। CHAR, VARCHARऔर पाठ क्षेत्रों के सभी प्रकार असंवेदनशील मामले की तुलना करते हैं।

ख। CHAR BINARY, VARCHAR BINARY और BLOB फ़ील्ड्स के सभी संस्करण केस संवेदी की तुलना करते हैं।

यदि आप (ख) से (ख) के क्षेत्र से एक क्षेत्र की तुलना करते हैं, तो तुलना संवेदनशील (केस सेंसिटिविटी जीत) होगी। MySQL संदर्भ मैनुअल के अध्याय "7.2.7 स्ट्रिंग प्रकार" देखें और सॉर्टिंग और तुलना पर बयान देखें।

V3.23.0 के साथ शुरू करते हुए यह भी शामिल है कि कास्ट ऑपरेटर के साथ मामले की संवेदनशीलता में तुलना करने BINARYके लिए, शामिल फ़ील्ड के प्रकारों से स्वतंत्र होना संभव है। MySQL संदर्भ मैनुअल के अध्याय "7.3.7 कास्ट ऑपरेटरों" को देखें।

तो आप भी user_name का प्रकार बदल सकते हैं, या V3.23.x के साथ कुछ इस तरह आज़मा सकते हैं:

SELECT phone FROM user WHERE BINARY username LIKE '%term%';

1

में मेरी स्थिति, मैं पहुँच 2010 का उपयोग कर रहा है, लेकिन मैं एक ही समस्या थी अभी तक समाधान अलग है: का प्रयोग करें StrComp()समारोह और परीक्षण अपनी वापसी शून्य होने के लिए।

StrComp( thing, 'abc', 0) = 0

क्योंकि StrComp()रिटर्न -1अगर पहला तर्क "छोटा" है, 1अगर यह "बड़ा" है, और 0यदि यह "बराबर" है, तो StrComp()=0, आपके पास केस-संवेदी मिलान है।

यहाँ , यहाँ या यहाँ देखें ।


0

यह चरित्र सेट की परवाह किए बिना MySQL में काम करेगा। का चयन करें 'परीक्षण' REGEXP बिनरी 'टेस्ट' के रूप में परिणाम; B BINARY ’डालने से एक द्विआधारी तुलना होती है।


-2

असंवेदनशील खोज के लिए इसे आज़माएं, यह शानदार प्रदर्शन के साथ ठीक काम करता है:

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.