¿SQL Server comprueba la distinción entre mayúsculas y minúsculas?
-
05-07-2019 - |
Pregunta
¿Cómo puedo verificar si una base de datos en SQL Server distingue entre mayúsculas y minúsculas?Anteriormente he estado ejecutando la consulta:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
Pero estoy buscando otras formas porque esto me ha dado problemas en el pasado.
Editar - Un poco más de información:Un producto existente tiene muchos procedimientos almacenados preescritos.En un procedimiento almacenado @test != @TEST
dependiendo de la sensibilidad del propio servidor.Entonces, lo que estoy buscando es la mejor manera de verificar la sensibilidad del servidor.
Solución
La clasificación se puede establecer en varios niveles:
- Servidor
- Base de datos
- Columna
Entonces podría tener una columna sensible a mayúsculas y minúsculas en una base de datos insensible 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 negocios para la distinción entre mayúsculas y minúsculas de una sola columna de datos, pero supongo que podría haberlo.
Comprobar clasificación del servidor
SELECT SERVERPROPERTY('COLLATION')
Comprobar clasificación de la base de datos
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Comprobar clasificación de columnas
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Otros consejos
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 clasificació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, lo que obliga a que distinga 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:
Intercalación Column_Name
mycolumn SQL_Latin1_General_CP1_CI_AS
Independientemente de lo que devuelva la columna 'Colación', ahora sabe a qué debe volver a cambiar después de realizar el siguiente cambio, lo 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 arruina las cosas, puede cambiarlo de nuevo, simplemente emitiendo una nueva declaració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 golpe de 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 por COLLATION
.
WHERE
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.
Se puede verificar el <=> en cada nivel como se menciona en la respuesta de Raj More .
Comprobar clasificación del servidor
SELECT SERVERPROPERTY('COLLATION')
Comprobar clasificación de la base de datos
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Comprobar clasificación de columnas
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Comprobar clasificación de expresiones
Para el nivel de expresión <=> necesita mirar la expresión. :)
Por lo general, estaría al final de la expresión como en el siguiente ejemplo.
SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
Descripción de clasificación
Para obtener una descripción de cada valor <=> intente esto.
SELECT * FROM fn_helpcollations()
Y deberías ver algo como esto.
Siempre puede poner una cláusula <=> para filtrar y ver la descripción solo para su <=>.
Puede encontrar una lista de intercalaciones aquí .
Te interesa el cotejo.Podrías crear algo basado en este fragmento:
SELECT DATABASEPROPERTYEX('master', 'Collation');
Actualizar
Según su edición, si @test
y @TEST
alguna vez puede hacer referencia a dos variables diferentes, no es SQL Server.Si ve problemas donde el mismo La variable no es igual a sí misma, verifique si esa variable es NULL
, porque NULL = NULL
devuelve `falso.
La mejor manera de trabajar con tablas ya creadas es que, Vaya al Editor de consultas del servidor SQL
Tipo: sp_help <tablename>
Esto mostrará la estructura de la tabla, vea los detalles del campo deseado en la columna COLLATE.
luego escriba la consulta como:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'
Podría ser un esquema de caracteres diferente < SQL_Latin1_General_CP1_CI_AS
> ;, así que es mejor averiguar el esquema exacto que se ha utilizado en esa columna.
¿Cómo puedo verificar si una base de datos en SQL Server distingue entre mayúsculas y minúsculas?
Puede usar la siguiente consulta que devuelve que su base de datos informada distingue entre mayúsculas y minúsculas o está en orden binario (con resultado nulo):
;WITH collations AS (
SELECT
name,
CASE
WHEN description like '%case-insensitive%' THEN 0
WHEN description like '%case-sensitive%' THEN 1
END isCaseSensitive
FROM
sys.fn_helpcollations()
)
SELECT *
FROM collations
WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation'));
Para más información, lea esta información de MSDN ;).
SQL Server no distingue entre mayúsculas y minúsculas. SELECT * FROM SomeTable
es lo mismo que SeLeCT * frOM soMetaBLe
.