guia - ¿El operador LIKE distingue entre mayúsculas y minúsculas con el servidor MSSQL?
qgis manual (7)
En la documentación sobre el operador LIKE , no se dice nada sobre la sensibilidad de mayúsculas y minúsculas. ¿Lo es? ¿Cómo habilitarlo / deshabilitarlo?
Estoy consultando columnas varchar(n)
, en una instalación de Microsoft SQL Server 2005, si eso importa.
El operador like
toma dos cadenas. Estas cadenas deben tener intercalaciones compatibles, que se explican here .
En mi opinión, las cosas se complican. La siguiente consulta devuelve un error que indica que las intercalaciones son incompatibles:
select *
from INFORMATION_SCHEMA.TABLES
where ''abc'' COLLATE SQL_Latin1_General_CP1_CI_AS like ''ABC'' COLLATE SQL_Latin1_General_CP1_CS_AS
En una máquina aleatoria aquí, la intercalación predeterminada es SQL_Latin1_General_CP1_CI_AS
. La siguiente consulta es exitosa, pero no devuelve filas:
select *
from INFORMATION_SCHEMA.TABLES
where ''abc'' like ''ABC'' COLLATE SQL_Latin1_General_CP1_CS_AS
Los valores "abc" y "ABC" no coinciden en un mundo sensible a mayúsculas y minúsculas.
En otras palabras, existe una diferencia entre no tener intercalación y usar la intercalación predeterminada. Cuando un lado no tiene intercalación, se le "asigna" una intercalación explícita del otro lado.
(Los resultados son los mismos cuando la intercalación explícita está a la izquierda).
Intenta correr,
SELECT SERVERPROPERTY(''COLLATION'')
A continuación, averigüe si su intercalación distingue entre mayúsculas y minúsculas o no.
No es el operador el que distingue entre mayúsculas y minúsculas, es la columna misma.
Cuando se realiza una instalación de SQL Server, se elige una intercalación predeterminada para la instancia. A menos que se mencione explícitamente lo contrario (consulte la cláusula intercalada abajo) cuando se crea una nueva base de datos hereda la intercalación de la instancia y cuando se crea una nueva columna hereda la intercalación de la base de datos a la que pertenece.
Una intercalación como sql_latin1_general_cp1_ci_as
dicta cómo debe tratarse el contenido de la columna. CI significa insensible a mayúsculas y AS significa acento sensible.
Una lista completa de intercalaciones está disponible en https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx
(a) Para verificar una colación de instancia
select serverproperty(''collation'')
(b) Para verificar una recopilación de la base de datos
select databasepropertyex(''databasename'', ''collation'') sqlcollation
(c) Para crear una base de datos usando una colación diferente
create database exampledatabase
collate sql_latin1_general_cp1_cs_as
(d) Para crear una columna usando una colación diferente
create table exampletable (
examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
)
(e) Para modificar una colación de columnas
alter table exampletable
alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
Es posible cambiar una instancia y las intercalaciones de bases de datos, pero no afecta a los objetos creados anteriormente.
También es posible cambiar una recopilación de columnas sobre la marcha para la comparación de cadenas, pero esto no se recomienda en un entorno de producción porque es extremadamente costoso.
select
column1 collate sql_latin1_general_cp1_ci_as as column1
from table1
Puede cambiar fácilmente la intercalación en el estudio de Microsoft SQL Server Management.
- haga clic derecho en la tabla -> diseño.
- elija su columna, baje las propiedades de la columna i a Collation.
- Establezca su preferencia de clasificación marcando "Case Sensitive"
Si desea lograr una búsqueda sensible a mayúsculas y minúsculas sin cambiar la intercalación de la columna / base de datos / servidor, siempre puede usar la cláusula COLLATE
, por ejemplo
USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CS_AS);
GO
INSERT dbo.foo VALUES(''John''),(''john'');
GO
SELECT bar FROM dbo.foo
WHERE bar LIKE ''j%'';
-- 1 row
SELECT bar FROM dbo.foo
WHERE bar COLLATE Latin1_General_CI_AS LIKE ''j%'';
-- 2 rows
GO
DROP TABLE dbo.foo;
Funciona de la otra manera, también, si su columna / base de datos / servidor es sensible a mayúsculas y minúsculas y no desea una búsqueda sensible a mayúsculas y minúsculas, por ej.
USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CI_AS);
GO
INSERT dbo.foo VALUES(''John''),(''john'');
GO
SELECT bar FROM dbo.foo
WHERE bar LIKE ''j%'';
-- 2 rows
SELECT bar FROM dbo.foo
WHERE bar COLLATE Latin1_General_CS_AS LIKE ''j%'';
-- 1 row
GO
DROP TABLE dbo.foo;
Tiene una opción para definir el orden de clasificación en el momento de definir su tabla. Si define una orden sensible a mayúsculas y minúsculas, su operador LIKE
se comportará de una manera que distingue entre mayúsculas y minúsculas; si define una orden de intercalación que no distingue entre mayúsculas y minúsculas, el operador LIKE
también ignorará el caso de caracteres:
CREATE TABLE Test (
CI_Str VARCHAR(15) COLLATE Latin1_General_CI_AS -- Case-insensitive
, CS_Str VARCHAR(15) COLLATE Latin1_General_CS_AS -- Case-sensitive
);
Aquí hay una demostración rápida en sqlfiddle que muestra los resultados del orden de clasificación en las búsquedas con LIKE
.
Toda esta charla sobre colación parece un poco complicada. ¿Por qué no usar algo como:
IF UPPER(@@VERSION) NOT LIKE ''%AZURE%''
Entonces su cheque es insensible a mayúsculas sea cual sea la colación