SQL Case Sensitive String So sánh


234

Làm thế nào để bạn so sánh các chuỗi để so sánh là đúng chỉ khi các trường hợp của mỗi chuỗi là bằng nhau. Ví dụ:

Select * from a_table where attribute = 'k'

... sẽ trả về một hàng có thuộc tính 'K'. Tôi không muốn hành vi này.


Nó có thể không phải là những gì bạn cần nhưng bạn có thể thay đổi Collation hoặc sử dụng Collation cụ thể trong truy vấn của mình.
Kane

7
Sản phẩm SQL nào?
ngày

Câu trả lời:


388
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

Đã lừa


4
Tôi thường sử dụng Latin1_General_Bin
gbn

3
Có, cách tiếp cận Tiêu chuẩn là sử dụng đối chiếu không phân biệt chữ hoa chữ thường, mặc dù bản thân các đối chiếu là dành riêng cho nhà cung cấp. Là cú pháp máy chủ SQL của bạn?
onedaywhen

Trong trường hợp của tôi, tôi có 1 cột trong db phân biệt chữ hoa chữ thường. Tôi cần so sánh nó với một cột (CI) tiêu chuẩn. Tôi đã sử dụng một biến thể của WHERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS)
Hypnovirus

2
Cảm ơn nhưng Latin1_General_CS_AS là gì ?? Nó có phải là từ khóa đặc biệt không?
Vijay Singh Rana

2
@VijaySinghRana Latin1_General_CS_ASlà một đặc điểm kỹ thuật của đối chiếu. Đối chiếu đề cập đến một bộ quy tắc xác định cách sắp xếp và so sánh dữ liệu. Xem trang này để biết thêm thông tin.
amccormack

51

Bạn cũng có thể chuyển đổi thuộc tính đó theo phân biệt chữ hoa chữ thường bằng cú pháp này:

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

Bây giờ tìm kiếm của bạn sẽ được phân biệt chữ hoa chữ thường .

Nếu bạn muốn làm cho trường hợp cột đó không nhạy cảm nữa, thì hãy sử dụng

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS

29

Bạn có thể dễ dàng Chuyển đổi các cột thành VARBINARY (Độ dài tối đa), Độ dài phải là mức tối đa bạn mong muốn để tránh so sánh bị lỗi, Nó đủ để đặt độ dài làm độ dài cột. Cột Trim giúp bạn so sánh giá trị thực ngoại trừ không gian có ý nghĩa và có giá trị trong các cột trong bảng của bạn, Đây là một mẫu đơn giản và như bạn có thể thấy tôi Cắt giá trị cột rồi chuyển đổi và so sánh.

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))

Hy vọng điều này giúp đỡ.


2
Chính xác những gì tôi đang tìm kiếm. Một cách đơn giản để thực hiện so sánh phân biệt chữ hoa chữ thường một lần để tìm các mục có chứa các ký tự chữ hoa.
Mike D.

20

Cũng giống như một cách khác, bạn có thể sử dụng HASHBYTES, đại loại như thế này:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')

1
Còn va chạm thì sao? Nó rất hiếm nhưng tôi cho rằng sẽ có nhiều chuỗi băm đến cùng một giá trị.
David Klempfner 23/11/18

Có thể, nhưng cực kỳ hiếm trên một ví dụ chuỗi đơn giản như vậy tôi đã nghĩ.
Dave Sexton

@DavidKlempfner tại sao trước tiên không làm phép so sánh và nếu chúng khớp thì cũng kiểm tra hashbyte? Chúng ta có thể biến nó thành một hàm và gọi nó như StringAreCaseSensitiveEqual (a, b) => a = b VÀ HASHBYTES ('sha1', a) = HASHBYTES ('sha1', b)
Demetris Leptos

3

Bạn có thể định nghĩa attributenhư BINARYhoặc sử dụng INSTRhoặc STRCMPđể thực hiện tìm kiếm của bạn.


Câu trả lời này dường như không phải là về SQL Server trên mỗi thẻ câu hỏi. Đó DBMS thiếu những INSTRSTRCMPchức năng.
Jonas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.