Я использую Microsoft SQL Server 2008 R2 (с последними пакетами обновления/исправлениями), а сопоставление базы данных — SQL_Latin1_General_CP1_CI_AS.
Следующий код:
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
дает следующие результаты:
(затронуты 1 ряд)
Сообщение 2601, уровень 14, состояние 1, строка 8
Не удается вставить повторяющуюся ключевую строку в объект «dbo.Test» с уникальным индексом «UniqueIndex». Повторяющееся значение ключа (sample).
Заявление было прекращено.
‐‐‐‐‐‐‐‐‐‐‐‐
>образец<
(затронуты 1 ряд)
Мои вопросы:
- Я предполагаю, что индекс не может хранить конечные пробелы. Может ли кто-нибудь указать мне на официальную документацию, которая определяет/определяет это поведение?
- Есть ли настройка, чтобы изменить это поведение, то есть заставить его распознавать «образец» и «образец» как два разных значения (кстати, они есть), чтобы оба они могли быть в индексе.
- С какой стати SELECT возвращает строку? SQL Server должен делать что-то действительно забавное/умное с пробелами в предложении WHERE, потому что, если я удалю уникальность в индексе, обе команды INSERT будут работать нормально, а SELECT вернет две строки!
Любая помощь/указатель в правильном направлении будет оценена по достоинству. Спасибо.