2009-12-02 23 views
86

Tôi muốn thực hiện tìm kiếm phân biệt chữ hoa chữ thường trong truy vấn SQL của mình. Nhưng theo mặc định, SQL Server không xem xét trường hợp của các chuỗi.Làm thế nào để thực hiện tìm kiếm trường hợp nhạy cảm trong mệnh đề WHERE (Tôi đang sử dụng SQL Server)?

Bất kỳ ý tưởng nào về cách thực hiện tìm kiếm phân biệt chữ hoa chữ thường trong truy vấn SQL?

+0

Liên kết này có thể giúp bạn http://www.codefari.com/2015/09/case-sensitive-search-on-column-in-sql.html – Singh

Trả lời

89

Có thể thực hiện qua changing the Collation. Theo mặc định, nó không phân biệt chữ hoa chữ thường.

Trích từ liên kết:

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 
+0

Cách sử dụng khi chúng tôi có thay vào đó =. giống như WHERE CustID (@CustID) – rinuthomaz

140

Bằng cách sử dụng đối chiếu hoặc đúc để nhị phân, như thế này:

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 

Việc sao username/password tồn tại để cung cấp cho động cơ khả năng sử dụng các chỉ số . Collation ở trên là một trường hợp nhạy cảm collation, thay đổi một trong những bạn cần nếu cần thiết.

Thứ hai, đúc để nhị phân, có thể được thực hiện như thế này:

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 
+8

Mọi người đọc câu hỏi này cũng có thể thấy hữu ích khi đọc cách thay đổi chính cột để phân biệt chữ hoa chữ thường, loại bỏ nhu cầu sử dụng đối chiếu trong mệnh đề WHERE. Xem: http://stackoverflow.com/a/485394/908677 –

+0

Phương thức truyền theo phương thức varbinary làm việc cho tôi khi được sử dụng trực tiếp trên cơ sở dữ liệu, nhưng không hoạt động khi gửi cùng một câu lệnh từ một ứng dụng .NET - không biết tại sao . Nhưng phương pháp đối chiếu hoạt động tốt. – Doug

+1

Câu trả lời này sẽ là hoàn hảo nếu nó bao gồm một giải thích về nơi để đặt cụm từ tìm kiếm, nghĩa là cụm từ tương tự với từ 'giống như '* hay cụm từ thông dụng *" 'tìm kiếm SQL sẽ được chèn vào. –

13

Bạn có thể làm cho các truy vấn sử dụng chuyển đổi sang varbinary - đó là rất dễ dàng. Ví dụ:

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

SỬ DỤNG BINARY_CHECKSUM

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

Điều này không có nghĩa là nó không còn so sánh chính xác nữa?Đôi khi nó có thể trả về sự thật rằng chúng không thực sự giống nhau? –

+1

Tôi đồng ý @ O'Rooney điều này sẽ nhân dịp trả về những mặt tích cực sai. –

4

sử dụng 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 

... trong mệnh đề where

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 

hoặc để tìm một giá trị

declare @value_b nvarchar(1) = 'A' 

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

-- output: 
-- A = A 
2

Trong MySQL nếu bạn không muốn thay đổi collation và muốn thực hiện trường hợp tìm kiếm nhạy cảm thì chỉ cần sử dụng nhị phân từ khóa như thế này:

SELECT * FROM table_name WHERE binary [email protected]_parameter and binary [email protected]_parameter 
+0

Đó không phải là truy vấn SQL Server hợp lệ. Tôi nghĩ đó là MySQL –

+1

Hoạt động hoàn hảo trên MySQL –

1

sử dụng Latin1_General_CS như collation của bạn trong sql db của bạn

Các vấn đề liên quan