Estoy usando Microsoft SQL Server 2008 R2 (con el último Service Pack/parches) y la recopilación de la base de datos es SQL_Latin1_General_CP1_CI_AS.Comportamiento de índice único, columna varchar y espacios (en blanco)
el siguiente código:
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 los siguientes resultados:
(1 fila (s) afectada)
Msg 2601, nivel 14, estado 1, línea 8
No se puede insertar una fila de clave duplicada en el objeto 'dbo.Test' con el índice único 'UniqueIndex'. El valor duplicado de la clave es (muestra).
La declaración ha finalizado.
‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐
> muestra <
(1 fila (s) afectada)
Mi pregunta s son:
- Supongo que el índice no puede almacenar espacios finales. ¿Alguien puede indicarme documentación oficial que especifique/defina este comportamiento?
- Hay una configuración para cambiar este comportamiento, es decir, hacer que reconozca 'muestra' y 'muestra' como dos valores diferentes (que son, por cierto) para que ambos puedan estar en el índice.
- ¿Por qué en la Tierra es el SELECTO que devuelve una fila? SQL Server debe estar haciendo algo realmente divertido/inteligente con los espacios en la cláusula WHERE porque si elimino la exclusividad en el índice, ambos INSERT correrán OK y el SELECT devolverá dos filas.
Cualquier ayuda/puntero en la dirección correcta sería apreciada. Gracias.
Gracias por los punteros, chicos. Mea culpa por ser demasiado perezoso para Google eso solo. En mi opinión, el comportamiento definido por el estándar no es intuitivo. Me imagino que 9 de cada 10 desarrolladores dirían que 'a' y 'a' NO son la misma cadena, pero bueno. – Eric