2009-08-03 23 views

Trả lời

103

Trong cấu hình mặc định của cơ sở dữ liệu SQL Server, so sánh chuỗi không phân biệt chữ hoa chữ thường. Nếu cơ sở dữ liệu của bạn ghi đè cài đặt này (thông qua việc sử dụng một đối chiếu thay thế), thì bạn sẽ cần xác định loại collation nào để sử dụng trong truy vấn của mình.

SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS 

Lưu ý rằng collation tôi cung cấp chỉ là một ví dụ (mặc dù nó sẽ có nhiều khả năng chỉ tốt cho bạn). Một phác thảo toàn diện hơn về các collations SQL Server có thể được tìm thấy here.

2

cơ sở dữ liệu gì là bạn không? Với MS SQL Server, nó là một thiết lập toàn bộ cơ sở dữ liệu, hoặc bạn có thể vượt quá nó cho mỗi truy vấn với từ khóa COLLATE.

25

Thông thường, so sánh chuỗi phân biệt chữ hoa chữ thường. Nếu cơ sở dữ liệu của bạn được cấu hình cho trường hợp đối chiếu nhạy cảm, bạn cần phải buộc phải sử dụng một trường hợp không nhạy cảm một:

SELECT balance FROM people WHERE email = '[email protected]' 
    COLLATE SQL_Latin1_General_CP1_CI_AS 
+3

Có vẻ như ai đó nhanh hơn tôi :-) –

+4

+1 Tôi thích câu trả lời ngắn gọn (và thanh cuộn) của bạn nhiều hơn. –

4

Bạn có thể buộc các trường hợp nhạy cảm, đúc đến một varbinary như thế:

SELECT * FROM myTable 
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal') 
+2

Mặc dù đây là chức năng nhưng đây không phải là cách tiếp cận được khuyến khích. Collations có để quản lý phân loại và so sánh chuỗi. –

+0

@AdamRobinson không phải là điều này về "so sánh chuỗi"? – Fandango68

19

tôi tìm thấy một giải pháp khác ở nơi khác; tức là, để sử dụng

upper(@yourString) 

nhưng mọi người ở đây đều nói rằng, trong SQL Server, điều đó không quan trọng vì nó bỏ qua trường hợp? Tôi khá chắc rằng cơ sở dữ liệu của chúng tôi phân biệt chữ hoa chữ thường.

+4

Bạn chính xác rằng một cơ sở dữ liệu có thể được làm cho trường hợp nhạy cảm, nhưng điều này là khá kém hiệu quả, ngay cả khi nó là cần thiết. COLLATE là từ khóa để sử dụng. – mjaggard

+1

Cảm ơn bạn đã thực hiện điều đó, @mjaggard. Tôi hy vọng bạn, hoặc bất cứ ai dường như downvote câu trả lời của tôi, xây dựng cho tốt của bất cứ ai như bản thân mình những người tìm kiếm và tìm câu trả lời như tôi. – Danny

+1

Được bình chọn này vì nó là một lời giải thích hoàn toàn hợp lý. Collate smacks của quá nhiều chi phí và những gì nếu chuỗi của bạn có các ký tự trong đó collation không hiểu? Latin 1 là một lược đồ mã hóa tệ hại.Chúc may mắn nhận được kết quả có ý nghĩa nếu chuỗi của bạn có dấu nháy đơn trong đó (Giống như: O'Brien). – eggmatters

5

Không, chỉ sử dụng LIKE sẽ không hoạt động. LIKE tìm kiếm các giá trị khớp chính xác với mẫu đã cho của bạn. Trong trường hợp này, LIKE sẽ chỉ tìm thấy văn bản 'sOmeVal' chứ không phải 'someval'.

Một giải pháp có thể truy nguyên được đang sử dụng hàm LCASE(). LCASE('sOmeVal') nhận chuỗi chữ thường của văn bản của bạn: 'someval'. Nếu bạn sử dụng chức năng này cho cả hai bên so sánh của bạn, nó hoạt động:

SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')

Báo cáo so sánh hai chuỗi chữ thường, do đó bạn 'sOmeVal' sẽ phù hợp với tất cả các ký hiệu khác của 'someval' (ví dụ như 'Someval ',' sOMEVAl ', v.v.).

+6

Trong 99,9% cài đặt SQL Server được đối chiếu _CI, LIKE là trường hợp không nhạy cảm. – RichardTheKiwi

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