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