Tôi đang sử dụng Microsoft SQL Server 2008 R2 (với gói dịch vụ/bản vá mới nhất) và collation cơ sở dữ liệu là SQL_Latin1_General_CP1_CI_AS.Hành vi của chỉ mục duy nhất, cột VARCHAR và (trống)
Các mã sau đây:
SET ANSI_PADDING ON;
GO
CREATE TABLE Test (
Code VARCHAR(16) NULL
);
CREATE UNIQUE INDEX UniqueIndex
ON Test(Code);
INSERT INTO Test VALUES ('sample');
INSERT INTO Test VALUES ('sample ');
SELECT '>' + Code + '<' FROM Test WHERE Code = 'sample ';
GO
tạo ra kết quả như sau:
(1 row (s) bị ảnh hưởng)
Msg 2601, Level 14, State 1, Line 8
Không thể chèn hàng khóa trùng lặp trong đối tượng 'dbo.Test' với chỉ mục duy nhất 'UniqueIndex'. Giá trị khóa trùng lặp là (mẫu).
Tuyên bố đã bị chấm dứt.
‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐
> mẫu <
(1 row (s) bị ảnh hưởng)
Câu hỏi của tôi s là:
- Tôi cho rằng chỉ mục không thể lưu trữ dấu cách. Bất cứ ai có thể chỉ cho tôi tài liệu chính thức xác định/xác định hành vi này?
- Có một cài đặt để thay đổi hành vi này, có nghĩa là, biến nó thành 'mẫu' và 'mẫu' thành hai giá trị khác nhau (theo cách này) để cả hai có thể nằm trong chỉ mục.
- Tại sao Earth lại là SELECT trả về hàng? SQL Server phải làm một cái gì đó thực sự hài hước/thông minh với các khoảng trống trong mệnh đề WHERE bởi vì nếu tôi loại bỏ tính duy nhất trong chỉ mục, cả hai INSERT sẽ chạy OK và SELECT sẽ trả về hai hàng!
Mọi trợ giúp/con trỏ đi đúng hướng sẽ được đánh giá cao. Cảm ơn.
Cám ơn các con trỏ, chàng trai. Mea culpa vì quá lười biếng với Google. Theo tôi, hành vi được xác định bởi tiêu chuẩn không trực quan. Tôi tưởng tượng rằng 9 trong số 10 nhà phát triển sẽ nói rằng 'a' và 'a' KHÔNG phải là cùng một chuỗi, nhưng tốt thôi. – Eric