Solución:
La clasificación se puede establecer en varios niveles:
- Servidor
- Base de datos
- Columna
Por lo tanto, podría tener una columna sensible a mayúsculas y minúsculas en una base de datos sensible a mayúsculas y minúsculas. Todavía no me he encontrado con una situación en la que se pueda hacer un caso de negocio para la sensibilidad a mayúsculas y minúsculas de una sola columna de datos, pero supongo que podría haberlo.
Verificar la intercalación del servidor
SELECT SERVERPROPERTY('COLLATION')
Comprobar la intercalación de la base de datos
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Comprobar la intercalación de columnas
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Si instaló SQL Server con las opciones de clasificación predeterminadas, es posible que las siguientes consultas devuelvan los mismos resultados:
CREATE TABLE mytable
(
mycolumn VARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT mytable VALUES('Case')
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
Puede modificar su consulta forzando la intercalación en el nivel de columna:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'case'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case'
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'
SELECT DATABASEPROPERTYEX('<database name>', 'Collation')
Como cambiar esta configuración puede afectar las aplicaciones y las consultas SQL, primero aislaría esta prueba. Desde SQL Server 2000, puede ejecutar fácilmente una instrucción ALTER TABLE para cambiar el orden de clasificación de una columna específica, obligándola a distinguir entre mayúsculas y minúsculas. Primero, ejecute la siguiente consulta para determinar a qué necesita volver a cambiarla:
EXEC sp_help 'mytable'
El segundo conjunto de registros debe contener la siguiente información, en un escenario predeterminado:
Column_Name Collation
mycolumn SQL_Latin1_General_CP1_CI_AS
Independientemente de lo que devuelva la columna ‘Intercalación’, ahora sabe a qué debe volver a cambiarla después de realizar el siguiente cambio, que forzará la distinción entre mayúsculas y minúsculas:
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE Latin1_General_CS_AS
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
Si esto estropea las cosas, puede volver a cambiarlo, simplemente emitiendo una nueva instrucción ALTER TABLE (asegúrese de reemplazar mi identificador COLLATE con el que encontró anteriormente):
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE SQL_Latin1_General_CP1_CI_AS
Si está atascado con SQL Server 7.0, puede probar esta solución alternativa, que podría ser un poco más un impacto en el rendimiento (solo debería obtener un resultado para la PRIMERA coincidencia):
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10))
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'
El servidor SQL determina la distinción entre mayúsculas y minúsculas mediante COLLATION
.
COLLATION
se puede configurar en varios niveles.
- Nivel de servidor
- Nivel de base de datos
- Nivel de columna
- Nivel de expresión
Aquí está la referencia de MSDN.
Uno puede comprobar el COLLATION
en cada nivel como se menciona en la respuesta de Raj More.
Verificar la intercalación del servidor
SELECT SERVERPROPERTY('COLLATION')
Comprobar la intercalación de la base de datos
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Comprobar la intercalación de columnas
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Comprobar la intercalación de expresiones
Para el nivel de expresión COLLATION
necesitas mirar la expresión. 🙂
Generalmente estaría al final de la expresión como en el ejemplo siguiente.
SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
Descripción de la colación
Para obtener una descripción de cada COLLATION
valor prueba esto.
SELECT * FROM fn_helpcollations()
Y deberías ver algo como esto.
Siempre puedes poner un WHERE
cláusula para filtrar y ver la descripción solo para su COLLATION
.
Puede encontrar una lista de colaciones aquí.