Saltar al contenido

¿SQL Server comprueba la distinción entre mayúsculas y minúsculas?

Solución:

La clasificación se puede establecer en varios niveles:

  1. Servidor
  2. Base de datos
  3. 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.

  1. Nivel de servidor
  2. Nivel de base de datos
  3. Nivel de columna
  4. 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.

ingrese la descripción de la imagen aquí

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í.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *