Я использую 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'. Дубликат значения ключа (образец).
Оператор был прекращен.
------------
> образец <</p>
(затронут 1 ряд)
Мои вопросы:
- Я предполагаю, что индекс не может хранить конечные пробелы. Может кто-нибудь указать мне официальную документацию, которая определяет / определяет это поведение?
- Есть ли параметр, чтобы изменить это поведение, то есть заставить его распознавать 'sample' и 'sample' как два разных значения (какими они, кстати, являются), так что оба могут быть в индексе.
- С какой стати SELECT возвращает строку? SQL Server должен делать что-то действительно смешное / умное с пробелами в предложении WHERE, потому что если я уберу уникальность в индексе, оба INSERT будут работать нормально, а SELECT вернет две строки!
Буду признателен за любую помощь / указатель в правильном направлении. Спасибо.