Używam Microsoft SQL Server 2008 R2 (z najnowszymi dodatkami Service Pack/łatami), a sortowanie w bazie danych to SQL_Latin1_General_CP1_CI_AS.Zachowanie unikalnego indeksu, kolumny varchar i (puste) spacje
Następujący kod:
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
daje następujące wyniki:
(1 rzędu (i) oddziaływania)
Msg 2601, poziom 14, w stanie 1, linia 8
Nie można wstawić duplikatu wiersza klucza w obiekcie "dbo.Test" z unikalnym indeksem "UniqueIndex". Zduplikowana wartość klucza to (przykład).
Oświadczenie zostało wypowiedziane.
‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐
> próbki <
(1 rząd (a) dotyczy)
My pytanie s to:
- Zakładam, że indeks nie może przechowywać spacji końcowych. Czy ktoś może wskazać mi oficjalną dokumentację, która określa/definiuje to zachowanie?
- Czy istnieje ustawienie do zmiany tego zachowania, to znaczy, aby rozpoznać "próbka" i "próbka" jako dwie różne wartości (którymi są, przy okazji), aby oba mogły znajdować się w indeksie.
- Dlaczego na ziemi SELECT zwraca wiersz? SQL Server musi robić coś naprawdę zabawnego/sprytnego ze spacjami w klauzuli WHERE, ponieważ jeśli usuniemy unikalność indeksu, oba INSERT uruchomią się poprawnie, a SELECT zwróci dwa wiersze!
Każda pomoc/wskaźnik we właściwym kierunku zostanie doceniona. Dzięki.
Dzięki za wskazówki, chłopaki. Mea culpa za to, że sam jestem zbyt leniwy dla Google'a. Moim zdaniem zachowanie zdefiniowane przez standard nie jest intuicyjne. Wyobrażam sobie, że 9 na 10 programistów powie, że "a" i "a" NIE są tym samym ciągiem, ale no cóż. – Eric