versiones guia sql sql-server-2005 varchar sql-like

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