WHERE yan tümcesinde büyük / küçük harfe duyarlı bir arama nasıl yapılır (SQL Server kullanıyorum)?


150

SQL sorgumda büyük / küçük harfe duyarlı bir arama yapmak istiyorum. Ancak varsayılan olarak, SQL Server dizelerin durumunu dikkate almaz.

SQL sorgusunda büyük / küçük harfe duyarlı bir arama nasıl yapılır?

Yanıtlar:


174

Harmanlama değiştirilerek yapılabilir . Varsayılan olarak büyük / küçük harfe duyarlı değildir.

Bağlantıdan bir alıntı:

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

Veya sütunları büyük / küçük harfe duyarlı olacak şekilde değiştirin .


2
Bunun yerine = nasıl kullanılır. WHERE CustID in (@CustID) gibi
rinuthomaz

Harmanlama çoğu durumda çalışır, ancak verilerinizde başka dil karakterleri varsa, yanlış pozitifler döndürür: /schwarz-weißkarşı:/schwarz-weiss
Lazlow

162

Harmanlamayı veya ikiliye döküm kullanarak, şöyle:

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 

Kullanıcı adına / parolanın kopyalanması, motora dizin kullanma imkanı vermek için mevcuttur. Yukarıdaki harmanlama, Büyük / Küçük Harfe Duyarlı bir harmanlamadır, gerekirse ihtiyacınız olanla değiştirin.

İkinciye döküm olan ikincisi şu şekilde yapılabilir:

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
Bu soruyu okuyan kişiler, sütunun kendisinin büyük / küçük harfe duyarlı olacak şekilde nasıl değiştirileceğini de okuyabilir ve bu da WHERE yan tümcesinde harmanlama kullanma ihtiyacını ortadan kaldırır. Bakınız: stackoverflow.com/a/485394/908677
Elijah Lofgren

2
Varbinary yöntemi olarak döküm, doğrudan veritabanında kullanıldığında benim için çalıştı, ancak aynı ifadeyi bir .NET uygulamasından gönderirken işe yaramadı - neden bilmiyorum. Ancak harmanlama yöntemi işe yaradı.
Doug

1
Bu yanıt, aranan terimi nereye koyacağınıza, yani normal bir like "*word or phrase*"SQL aramasına benzer ifadenin nereye ekleneceğine ilişkin bir açıklama içeriyorsa mükemmel olurdu.
Konserve Adam

@CannedMan - Yukarıdaki harmanlama çözümünü LIKE deyimiyle aynı şekilde kullanabilirsiniz. Tüm büyük 'D' harflerini döndürmek için aşağıdakileri yapmanız yeterlidir. '% D%' Gibi Bazı Tabloların Sütun Adından "SEÇİN * COLLATE SQL_Latin1_General_CP1_CS_AS"
Radderz

Çek alfabesi ile çalışmaz. Test edilen kelime: 'ukázka'. Tabloda bir sütunda tek bir kelime olarak bulunur, ancak aramanız bulamadı.
Jan Macháček

14

Varbinary'ye dönüştürmeyi kullanarak sorguyu yapabilirsiniz - çok kolaydır. Misal:

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

2
Çek alfabesi ile çalışmaz. Test edilen kelime: 'ukázka'. Tabloda bir sütunda tek bir kelime olarak bulunur, ancak aramanız bulamadı.
Jan Macháček

7

BINARY_CHECKSUM KULLANIN

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

3
Bu artık kesin bir karşılaştırma olmadığı anlamına gelmez mi? Bazen gerçekte aynı olmadıklarının doğru döndüğü söylenebilir mi?
O'Rooney

3
Katılıyorum @ O'Rooney bu bazen yanlış pozitif dönüş olacak.
Des Horsley

5

HASHBYTES kullanın

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

... nerede fıkra

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

veya bir değer bulmak için

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'nizdeki harmanlama olarak Latin1_General_CS kullanın


2

Harmanlamayı değiştirmek istemiyorsanız ve büyük / küçük harfe duyarlı arama yapmak istiyorsanız MySQL'de sadece ikili anahtar kelimeyi kullanın :

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

2
Bu geçerli bir SQL Server sorgusu değil. Sanırım bu MySQL
Jon Tirjan

2
MySQL üzerinde mükemmel çalışır
WM

1
select * from incidentsnew1 
where BINARY_CHECKSUM(CloseBy) = BINARY_CHECKSUM(Upper(CloseBy))

-4

Diğerlerinin söylediği gibi, büyük / küçük harfe duyarlı bir arama yapabilirsiniz. Veya yalnızca belirtilen bir sütunun harmanlama biçimini değiştirin. Veritabanımdaki Kullanıcı / Parola sütunları için bunları aşağıdaki komutla harmanlama olarak değiştiririm:

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

Parolaları düz metin olarak saklamayın! Haşlanmış ve tuzlanmış olmalılar ve sonra karşılaştırma karma ve tuzda! Bu sadece korkunç bir cevap!
Nelson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.