MySQL केस असंवेदनशील चयन


242

क्या कोई मुझे बता सकता है कि क्या MySQL SELECTक्वेरी संवेदनशील है या डिफ़ॉल्ट रूप से असंवेदनशील है? और यदि नहीं, तो मुझे कौन सी क्वेरी भेजनी होगी ताकि मैं कुछ ऐसा कर सकूं:

SELECT * FROM `table` WHERE `Value` = "iaresavage"

जहां वास्तविकता में, वास्तविक मूल्य Valueहै IAreSavage


44
अंततः यह दर्ज किए गए टकराव पर निर्भर करता है - यदि यह '_ci' (केस-असंवेदनशील) या '_cs' (केस-संवेदी)
जोवन पेरोविक

15
यह एक खराब शब्द है;)। आधे उत्तर आपको दिखा रहे हैं कि केस असंवेदनशील तुलना कैसे करें, आधे मामले संवेदनशील के लिए लक्ष्य कर रहे हैं। और केवल 1 आपको बताता है कि डिफ़ॉल्ट वास्तव में असंवेदनशील है। :) यह ध्यान देने योग्य बात है कि असंवेदनशीलता तब भी काम करती है जब आप तुलना करते हैं जैसे'value' in ('val1', 'val2', 'val3')
SaltyNuts

5
@SaltyNuts के आदमी, इस सवाल को 7 साल बाद पढ़ रहे हैं और महसूस कर रहे हैं कि मैं कितना महान था! मैं सिर्फ दस्तावेज़ीकरण पढ़ सकता था और उत्तर का चयन वाक्य के बारे में पहले वाक्य की तरह है ...
२१

@JovanPerovic ने जो कहा, उसे जोड़ने के लिए, utf8_bin भी इसे संवेदनशील बनाता है। यकीन नहीं होता है कि अगर वह वापस अस्तित्व में है
Chiwda

जवाबों:


494

वे मामले असंवेदनशील हैं , जब तक कि आप बाइनरी तुलना नहीं करते हैं


3
मैं ज्यादातर टिम की टिप्पणी से सहमत हूं, मुझे नहीं लगता कि हर जगह अपने मूल्यों पर "कम ()" करने के लिए इसे संभालने का सबसे अच्छा तरीका है, एक वर्कअराउंड की तरह लगता है। लेकिन मैं इसे कई बार स्वीकार करता हूं कि यह समझ में आता है और आसान है। (कॉलिन ने उल्लेख किया था कि टकराव बेहतर था) हमारे पास ऐतिहासिक डेटा mysql तालिका में स्थानांतरित हो गया था, जिसने कुछ स्तंभ मानों के असंवेदनशील होने के कारण विरासत तर्क को तोड़ दिया था। हमें "GE1234" और "ge1234" के बीच अंतर जानने की जरूरत है, उन्हें अद्वितीय होने और उस तरह लॉग इन रहने की आवश्यकता है। हम अपना कॉलम बनाने के लिए तालिका विवरण इस तरह से सेट करते हैं: varchar (20) CHARACTER SET utf8 COLLATE utf8_bin
gregthegeek

19
मुझे नहीं पता कि इतने लोगों ने इसे वोट क्यों दिया। यह स्पष्ट रूप से यहां बताता है कि dev.mysql.com/doc/refman/5.0/en/case-s संवेदनशीलता. html यह है कि "... इसका मतलब है कि वर्णमाला वर्णों के लिए, तुलनात्मक रूप से मामला संवेदनशील होगा।" इसलिए अगर मैं 'डिकस्वाजवुड' की तलाश करता हूं तो यह 'डिक्सवेजवुड' नहीं उठाएगा। LOWER () के साथ भी यही करना होगा। तो सवाल का मेरा जवाब: आपके विशेष मामले में SELECT वास्तव में केस-संवेदी है।
लूफ़्टवाफ़ल

10
@ user1961753: फिर से पढ़ें: "बाइनरी स्ट्रिंग्स (वर्बिनरी, बूँद) के लिए ... केस सेंसिटिव होगा"।
मार्क बी

1
@MarcB यह लिंक अब टूट गया है। क्या आप इसे ठीक कर सकते हैं? :)
Phiter

5
जैसा कि जोवन ने कहा, यह टकराव पर निर्भर करता है, इसलिए यह उत्तर बहुत गलत है।
phil294

117

आप मान और पारित पैरामीटर को कम कर सकते हैं:

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")

एक और (बेहतर) तरीका यह होगा कि COLLATEऑपरेटर को दस्तावेज में कहा गया है


21
तब इस SELECTकथन का उपयोग कैसे दिखेगा COLLATE?
हाँ बैरी

11
यह कहता है, ऊपर उल्लिखित प्रलेखन पृष्ठ पर, कि "गैर-स्ट्रिंग स्ट्रिंग तुलना डिफ़ॉल्ट रूप से असंवेदनशील है"।
प्रति क्वेस्ट एरॉनसन

9
इस जवाब से कितने लोग डर गए। @Marc ऊपर बताते हैं, की तुलना कर रहे हैं केस-संवेदी। आपको कोलाज और इंडेक्स को समझने और उन्हें ठीक से कॉन्फ़िगर करने की आवश्यकता है - स्ट्रिंग ट्रांसफ़ॉर्मेशन का उपयोग करना जैसे LOWER()या एक मनमाना COLLATEक्लॉज पूरी तरह से एक इंडेक्स को बायपास कर सकता है, और समय के साथ, जैसे-जैसे आपकी टेबल बढ़ती जाती है, इसमें कठोर प्रदर्शन निहितार्थ हो सकते हैं। संभावना है कि ये उपयोगकर्ता नाम आप देख रहे हैं? केस-असंवेदनशील टकराव का उपयोग करें और कॉलम में एक अद्वितीय सूचकांक जोड़ें। EXPLAINयह पुष्टि करने के लिए उपयोग करें कि सूचकांक का उपयोग किया जा रहा है।
mindplay.dk

1
मैं mindplay.dk के समान ही कहने वाला था ... ऊपरी () और निचला () सूचकांक को दरकिनार कर देता है और सीधे बड़े डेटाबेस तालिकाओं पर प्रदर्शन को प्रभावित करता है।
GTodorov

मैं दोनों mindplay.dk और GTodorov की राय से सहमत हूं। जहाँ खण्ड में एक लक्ष्य स्तंभ पर कुछ विधि का उपयोग कर सावधान रहें। कॉलम का इंडेक्स बेकार हो सकता है। का उपयोग करें!
ट्रैपर

51

का उपयोग करें

यह एक सरल चयन है

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

यह बाइनरी के साथ एक चयन है

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

या

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0


3
यह = (केवल * कुछ '=' कुछ ') से BINARY का उपयोग करने के लिए = (केवल चयन करें?
जिमी

@ जिमी तुम वास्तव में क्या मतलब है? कोड काम करता है। जब तुलना में एक पक्ष बाइनरी के लिए डाला जाता है तो तुलना बाइनरी की जाती है।
जोरी

@ जोरी ओह, मुझे लगता है कि मैं गलत था - मुझे लगा कि दोनों उदाहरणों में से एक के बराबर के दोनों किनारों पर BINARY था।
जिमी

मैंने सिर्फ इसलिए मतदान किया क्योंकि यह वास्तव में सही उत्तर है। MySQL वेबसाइट पर प्रलेखन के अनुसार वे कहते हैं कि BINARY कमांड का उपयोग करना बेहतर है क्योंकि यह आपके शब्दों / अनुरोधों को एक विशिष्ट भाषा में टाइप करने का प्रयास करता है क्योंकि BINARY कमांड का कहना है कि यह सब कुछ छोड़ देता है और इसे ठीक उसी तरह उपयोग करता है इसे प्रस्तुत किया गया है। इसलिए जब मैं एक उत्तर की तलाश में आया था - यहाँ दो उत्तर मुझे MySQL वेबसाइट पर ले गए और उनके डॉक्यूमेंट को देखने के लिए। BINARY का उपयोग करना बेहतर है। अनुवाद करने से अन्य समस्याएं हो सकती हैं।
मार्क मैनिंग

43

तुलनात्मक रूप से मामले असंवेदनशील होते हैं जब स्तंभ एक कोलाजेशन का उपयोग करता है जो _ci(जैसे कि डिफ़ॉल्ट latin1_general_ci कॉलेशन) के साथ समाप्त होता है और वे केस संवेदी होते हैं जब कॉलम एक कोलिशन का उपयोग करता है जो ( _csया और कॉलेशन के _binरूप में ) समाप्त होता है ।utf8_unicode_csutf8_bin

टकराव की जाँच करें

आप का उपयोग कर अपने सर्वर , डेटाबेस और कनेक्शन टकराव की जाँच कर सकते हैं :

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

और आप अपने टेबल कोलाज का उपयोग करके जांच कर सकते हैं :

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

कोलाज बदलो

आप अपने डेटाबेस, तालिका, या कॉलम कोलाजेशन को किसी मामले में संवेदनशील रूप में बदल सकते हैं:

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

आपकी तुलना अब केस-संवेदी होनी चाहिए।


25

WHERE वाक्यांश में स्ट्रिंग की तुलना संवेदनशील नहीं है। आप का उपयोग करने की तुलना करने की कोशिश कर सकते हैं

WHERE `colname` = 'keyword'

या

WHERE `colname` = 'KeyWord'

और आपको वही परिणाम मिलेगा । यह MySQL का डिफ़ॉल्ट व्यवहार है।

यदि आप चाहते हैं कि तुलना संवेदनशील हो , तो आप COLLATEइस तरह जोड़ सकते हैं :

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

एसक्यूएल इस के साथ एक अलग परिणाम देगा: जहां colnameलैटिन 1_general_cs = 'कीवर्ड'

latin1_general_cs अधिकांश डेटाबेस में आम या डिफ़ॉल्ट टकराव है।


16

आपके द्वारा चुना गया कोलाजेशन सेट करता है कि आप संवेदनशील हैं या नहीं।


9

डिफ़ॉल्ट केस असंवेदनशील है, लेकिन अगली सबसे महत्वपूर्ण बात आपको इस पर एक नज़र डालनी चाहिए कि तालिका को पहली जगह में कैसे बनाया गया था, क्योंकि आप तालिका बनाते समय केस संवेदनशीलता निर्दिष्ट कर सकते हैं।

नीचे दी गई स्क्रिप्ट एक तालिका बनाती है। नीचे की ओर ध्यान दें तो यह कहता है "COLLATE latin1_general_cs"। अंत में उस सीएस का अर्थ है मामला संवेदनशील। यदि आप चाहते थे कि आपकी तालिका असंवेदनशील हो तो आप उस भाग को छोड़ देंगे या "COLLATE latin1_general -ci" का उपयोग कर सकते हैं।

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

यदि आपकी परियोजना ऐसी है कि आप अपनी खुद की टेबल बना सकते हैं, तो यह आपके टेबल को बनाते समय आपकी केस सेंसिटिविटी वरीयता को निर्दिष्ट करने के लिए समझ में आता है।


3

SQL सेलेक्ट केस सेंसिटिव नहीं है।

यह लिंक आपको दिखा सकता है कि मामला संवेदनशील कैसे बनाया जा सकता है: http://web.archive.org/web/20080811231016/http://sqlserver2000.dat डेटाबेस. aspfaq.com:80/how-can-i-make-my- एसक्यूएल-प्रश्नों-केस-sensitive.html


4
आपके डेटाबेस पर निर्भर करता है, जैसा कि यहां कहीं और बताया गया है कि वे mysql पर हो सकते हैं।
विकरिक


2

यह भी ध्यान दें कि जब तक आप lower_case_table_nameनिर्देश को 1 में सेट नहीं करते हैं तब तक टेबल के नाम लिनक्स पर संवेदनशील होते हैं । ऐसा इसलिए है क्योंकि तालिकाओं को उन फाइलों द्वारा दर्शाया जाता है जो लिनक्स में केस सेंसिटिव होती हैं।

विशेष रूप से विंडोज पर विकास से सावधान रहें जो संवेदनशील नहीं है और उत्पादन के लिए तैनात करना जहां यह है। उदाहरण के लिए:

"SELECT * from mytable" 

टेबल के खिलाफ myTable विंडोज में सफल होगा, लेकिन लिनक्स में असफल हो जाता है, फिर से, जब तक कि उपरोक्त निर्देश सेट नहीं किया जाता है।

यहाँ संदर्भ: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-s संवेदनशीलता . html


1
+1 - केस के असंवेदनशील प्रश्नों और फिर लिनक्स पर विफल होने का परिदृश्य हमारी परियोजना में बहुत कुछ हुआ
विक

@ मैं अपनी परियोजना के साथ एक ही मुद्दा रहा हूँ। क्या आप मुझे बताएंगे कि आपने इसे कैसे ठीक किया?
कामरान अहमद

@KamranAhmed, आपको तालिका नामों के आवरण का उपयोग करने की आवश्यकता है, जैसा कि वे निर्माण लिपियों में दिखाई देते हैं
विक

@Vic अंतिम उपाय होगा, क्योंकि मुझे वस्तुतः बहुत सारे प्रश्नों को संशोधित करना होगा। मैं सोच रहा था, अगर ऐसा करने का कोई आसान तरीका होगा। हालांकि धन्यवाद!
कामरान अहमद

@KamranAhmed, lower_case_table_nameजिस उत्तर के तहत हम टिप्पणी कर रहे हैं, उसके अनुसार बदलने की कोशिश करें
विक

1

वर्तमान में स्वीकृत समाधान ज्यादातर सही है।

यदि आप एक गैर-स्ट्रिंग स्ट्रिंग (CHAR, VARCHAR, TEXT) का उपयोग कर रहे हैं, तो तुलना डिफ़ॉल्ट रूप से टकराव के मामले में असंवेदनशील हैं

यदि आप बाइनरी स्ट्रिंग (BINARY, VARBINARY, BLOB) का उपयोग कर रहे हैं, तो तुलना मामले के प्रति संवेदनशील हैं, इसलिए आपको LOWERअन्य उत्तरों में वर्णित अनुसार उपयोग करने की आवश्यकता होगी ।

यदि आप डिफ़ॉल्ट कॉलेशन का उपयोग नहीं कर रहे हैं और आप एक नॉनबिनरी स्ट्रिंग का उपयोग कर रहे हैं, तो केस सेंसिटिविटी का निर्धारण चुने हुए कॉलेशन द्वारा किया जाता है।

स्रोत: https://dev.mysql.com/doc/refman/8.0/en/case-s संवेदनशीलता . html बारीकी से पढ़ें। कुछ अन्य लोगों ने यह कहने की गलती की है कि तुलनात्मक रूप से मामला संवेदनशील या असंवेदनशील है। यह मामला नहीं है।


0

आप इसे आज़मा सकते हैं। आशा है कि यह उपयोगी होगा।

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "IAreSavage"

0

बाइनरी फ्लैग सेट के साथ स्ट्रिंग फ़ील्ड हमेशा केस संवेदनशील होंगे। क्या आपको गैर-बाइनरी टेक्स्ट फ़ील्ड का उपयोग करने के लिए एक केस सेंसिटिव सर्च की आवश्यकता है: SELECT 'टेस्ट' REGEXP BINARY 'टेस्ट' AS RESULT;

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