Utilizzo Microsoft SQL Server 2008 R2 (con il service pack/patch più recente) e le regole di confronto del database sono SQL_Latin1_General_CP1_CI_AS.Comportamento dell'indice univoco, colonna varchar e spazi (vuoti)
Il codice seguente:
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
produce i seguenti risultati:
(1 row (s) affected)
Messaggio 2601, livello 14, stato 1, riga 8
Impossibile inserire la riga chiave duplicata nell'oggetto 'dbo.Test' con indice univoco 'UniqueIndex'. Il valore della chiave duplicata è (campione).
La dichiarazione è stata chiusa.
‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐
> campione <
(1 row (s) affected)
La mia domanda s sono:
- Presumo che l'indice non può memorizzare spazi finali. Qualcuno può indicarmi la documentazione ufficiale che specifica/definisce questo comportamento?
- Esiste un'impostazione per modificare questo comportamento, cioè, riconoscere "campione" e "campione" come due valori diversi (che sono, tra l'altro) in modo che entrambi possano essere nell'indice.
- Perché su terra è il SELECT restituendo una riga? SQL Server deve fare qualcosa di veramente divertente/intelligente con gli spazi nella clausola WHERE perché se rimuovo l'unicità nell'indice, entrambi gli INSERT funzioneranno correttamente e SELECT restituirà due righe!
Qualsiasi aiuto/puntatore nella giusta direzione sarebbe apprezzato. Grazie.
Grazie per i puntatori, ragazzi. Mea culpa per essere troppo pigro con Google da solo. Secondo me, il comportamento definito dallo standard non è intuitivo. Immagino che 9 sviluppatori su 10 direbbero che 'a' e 'a' NON sono la stessa stringa, ma vabbè. – Eric