WHERE क्लॉज (मैं SQL सर्वर का उपयोग कर रहा हूं) में केस सेंसिटिव सर्च कैसे करूं?


150

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

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

जवाबों:


174

Collation को बदलकर किया जा सकता है । डिफ़ॉल्ट रूप से यह असंवेदनशील है।

लिंक से अंश:

SELECT 1
FROM dbo.Customers
WHERE   CustID = @CustID COLLATE SQL_Latin1_General_CP1_CS_AS
    AND CustPassword = @CustPassword COLLATE SQL_Latin1_General_CP1_CS_AS

या, केस संवेदी होने के लिए कॉलम बदलें


2
जब हम इसके बजाय = का उपयोग कैसे करें। (@CustID) में कस्टिड की तरह
rinuthomaz

ज्यादातर मामलों में कोलाज काम करता है, लेकिन अगर आपको अपने डेटा में अन्य भाषा के अक्षर मिल गए हैं, तो यह झूठी सकारात्मकता लौटाएगा: /schwarz-weißबनाम:/schwarz-weiss
लाजलो

162

बाइनरी को कोलिशन या कास्टिंग का उपयोग करके, जैसे:

SELECT *
FROM Users
WHERE   
    Username = @Username COLLATE SQL_Latin1_General_CP1_CS_AS
    AND Password = @Password COLLATE SQL_Latin1_General_CP1_CS_AS
    AND Username = @Username 
    AND Password = @Password 

इंजन को इंडेक्स का उपयोग करने की संभावना देने के लिए उपयोगकर्ता नाम / पासवर्ड का दोहराव मौजूद है। ऊपर दिया गया टकराव एक केस सेंसिटिव कॉलेशन है, यदि आवश्यक हो तो उसे बदल दें।

दूसरा, बाइनरी कास्टिंग, इस तरह किया जा सकता है:

SELECT *
FROM Users
WHERE   
    CAST(Username as varbinary(100)) = CAST(@Username as varbinary))
    AND CAST(Password as varbinary(100)) = CAST(@Password as varbinary(100))
    AND Username = @Username 
    AND Password = @Password 

13
इस प्रश्न को पढ़ने वाले लोगों को यह पढ़ने के लिए भी उपयोगी लग सकता है कि कैसे कॉलम को स्वयं संवेदनशील होने के लिए बदलना चाहिए जो WHERE क्लॉज में कोलाजेशन का उपयोग करने की आवश्यकता को समाप्त करता है। देखें: stackoverflow.com/a/485394/908677
एलिजा लोफग्रेन

2
डेटाबेस पर सीधे उपयोग किए जाने पर वर्बिनरी विधि के रूप में कलाकारों ने मेरे लिए काम किया, लेकिन .NET एप्लीकेशन से एक ही स्टेटमेंट भेजते समय काम नहीं किया - पता नहीं क्यों। लेकिन कोलाज विधि ने ठीक काम किया।
डॉग

1
यह उत्तर सही होगा यदि इसमें इस बात की व्याख्या शामिल हो कि शब्द की खोज कहाँ की जाए, यानी जहाँ नियमित like "*word or phrase*"एसक्यूएल खोज के समान वाक्यांश डाला जाएगा।
डिब्बाबंद आदमी

@CannedMan - आप उपरोक्त कोलाज समाधान का उपयोग LIKE स्टेटमेंट के साथ कर सकते हैं। सभी ऊपरी मामले 'डी' को वापस करने के लिए बस निम्नलिखित करें। "कुछ का चयन करें" जहां से कुछ भी हो, जैसे '% D%' COLLATE SQL_Latin1_General_CP1_CS_AS "
Radderz

यह चेक वर्णमाला के साथ काम नहीं करता है। परीक्षित शब्द: 'उक्तका'। यह एक स्तंभ में एक एकल शब्द के रूप में तालिका में है, लेकिन आपकी खोज को यह नहीं मिला।
Jan Macháček

14

आप परिवर्तनीय का उपयोग करके क्वेरी बना सकते हैं - यह बहुत आसान है। उदाहरण:

Select * from your_table where convert(varbinary, your_column) = convert(varbinary, 'aBcD') 

2
यह चेक वर्णमाला के साथ काम नहीं करता है। परीक्षित शब्द: 'उक्तका'। यह एक स्तंभ में एक एकल शब्द के रूप में तालिका में है, लेकिन आपकी खोज को यह नहीं मिला।
Jan Macháček

7

उपयोग BINARY_CHECKSUM

SELECT 
FROM Users
WHERE   
    BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username)
    AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password)

3
इसका मतलब यह नहीं होगा, कि यह अब एक सटीक तुलना नहीं है? कभी-कभी ऐसा भी हो सकता है कि यह सच है कि वे वास्तव में एक ही नहीं हैं?
ओ'रोनी

3
मैं मानता हूं @ ओ'रोनी इस अवसर पर झूठी सकारात्मकता लौटाएगा।
डेस हॉर्स्ले

5

HASHBYTES का उपयोग करें

declare @first_value nvarchar(1) = 'a'
declare @second_value navarchar(1) = 'A'

if HASHBYTES('SHA1',@first_value) = HASHBYTES('SHA1',@second_value) begin
    print 'equal'
end else begin
    print 'not equal'
end

-- output:
-- not equal

... कहां खंड में

declare @example table (ValueA nvarchar(1), ValueB nvarchar(1))

insert into @example (ValueA, ValueB)
values  ('a', 'A'),
        ('a', 'a'),
        ('a', 'b')

select  ValueA + ' = ' + ValueB
from    @example
where   hashbytes('SHA1', ValueA) = hashbytes('SHA1', ValueB)

-- output:
-- a = a

select  ValueA + ' <> ' + ValueB
from    @example
where   hashbytes('SHA1', ValueA) <> hashbytes('SHA1', ValueB)

-- output:
-- a <> A
-- a <> b

या एक मूल्य खोजने के लिए

declare @value_b nvarchar(1) = 'A'

select  ValueB + ' = ' + @value_b
from    @example
where   hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b)

-- output:
-- A = A

5

अपने sql db में अपने टकराव के रूप में लैटिन 1_General_CS का उपयोग करें


2

MySQL में यदि आप कोलाज नहीं बदलना चाहते हैं और केस सेंसिटिव सर्च करना चाहते हैं तो इस तरह से बाइनरी कीवर्ड का उपयोग करें:

SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter

2
यह एक मान्य SQL सर्वर क्वेरी नहीं है। मुझे लगता है कि
जॉन तिरुजन

2
MySQL पर पूरी तरह से काम करता है
WM


-4

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

ALTER TABLE `UserAuthentication` CHANGE `Password` `Password` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL;

पासवर्ड को प्लेनटेक्स्ट के रूप में स्टोर न करें! उन्हें हैशेड और नमकीन होना चाहिए, और फिर तुलना हैश और नमक पर है! यह बस एक भयानक जवाब है!
नेल्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.