Is de LIKE-operator hoofdlettergevoelig met SQL Server?

In de documentatie over de LIKE-operatorwordt niets verteld over de hoofdlettergevoeligheid ervan. Is het? Hoe in-/uitschakelen?

Ik vraag varchar(n)-kolommen op een Microsoft SQL Server 2005-installatie, als dat van belang is.


Antwoord 1, autoriteit 100%

Het is niet de operator die hoofdlettergevoelig is, het is de kolom zelf.

Wanneer een SQL Server-installatie wordt uitgevoerd, wordt een standaardsortering voor de instantie gekozen. Tenzij expliciet anders vermeld (controleer de sorteerclausule hieronder) wanneer een nieuwe database wordt gemaakt, erft deze de sortering van de instantie en wanneer een nieuwe kolom wordt gemaakt, erft deze de sortering van de database waartoe deze behoort.

Een sortering zoals SQL_Latin1_General_CP1_CI_ASbepaalt hoe de inhoud van de kolom moet worden behandeld. CI staat voor hoofdlettergevoelig en AS staat voor accentgevoelig.

Een volledige lijst met sorteringen is beschikbaar op https ://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx

(a) Een instantiesortering controleren

select serverproperty('collation')

(b) Een databasesortering controleren

select databasepropertyex('databasename', 'collation') sqlcollation

(c) Een database maken met een andere sortering

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d) Een kolom maken met een andere sortering

create table exampletable (
    examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
)

(e) Een kolomsortering wijzigen

alter table exampletable
alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null

Het is mogelijk om de sortering van een instantie en database te wijzigen, maar dit heeft geen invloed op eerder gemaakte objecten.

Het is ook mogelijk om een ​​kolomsortering on-the-fly te wijzigen om strings te vergelijken, maar dit wordt ten zeerste afgeraden in een productieomgeving omdat het extreem duur is.

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1

Antwoord 2, autoriteit 17%

Al dat gepraat over verzameling lijkt een beetje te ingewikkeld. Waarom gebruik je niet gewoon zoiets als:

IF UPPER(@@VERSION) NOT LIKE '%AZURE%'

Dan is uw cheque hoofdletterongevoelig, ongeacht de sortering


Antwoord 3, autoriteit 12%

Als u hoofdlettergevoelig wilt zoeken zonder de sortering van de kolom / database / server te wijzigen, kunt u altijd de COLLATE-clausule gebruiken, bijvoorbeeld

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;

Werkt ook andersom, als uw kolom/database/server hoofdlettergevoelig is en u geen hoofdlettergevoelige zoekopdracht wilt, bijvoorbeeld

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;

Antwoord 4, autoriteit 11%

U hebt de mogelijkheid om sorteervolgordete definiëren op het moment dat u uw tabel definieert. Als u een hoofdlettergevoelige volgorde definieert, zal uw like-operator zich hoofdlettergevoelig gedragen; als u een hoofdletterongevoelige sorteervolgorde definieert, negeert de operator likeook hoofdletters:

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
);

Hier is een snelle demo op sqlfiddlemet de resultaten van de sorteervolgorde bij zoekopdrachten met like.


Antwoord 5, autoriteit 6%

De operator likeheeft twee strings nodig. Deze strings moeten compatibele sorteringen hebben, wat wordt uitgelegd hier.

Naar mijn mening wordt het dan ingewikkeld. De volgende query geeft een foutmelding dat de sorteringen incompatibel zijn:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

Op een willekeurige computer hier is de standaardsortering SQL_Latin1_General_CP1_CI_AS. De volgende zoekopdracht is succesvol, maar levert geen rijen op:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

De waarden “abc” en “ABC” komen niet overeen in een hoofdlettergevoelige wereld.

Met andere woorden, er is een verschil tussen geen sortering hebben en de standaardsortering gebruiken. Als de ene kant geen sortering heeft, wordt aan de andere kant een expliciete sortering “toegewezen”.

(De resultaten zijn hetzelfde als de expliciete sortering aan de linkerkant staat.)


Antwoord 6, autoriteit 3%

Probeer te rennen,

select serverproperty('collation')

Ontdek vervolgens of uw sortering hoofdlettergevoelig is of niet.


Antwoord 7

Je kunt de eigenschap van elk item wijzigen.


Antwoord 8

Je kunt de sortering eenvoudig wijzigen in Microsoft SQL Server Management Studio.

  • rechtsklik tabel -> ontwerp.
  • kies uw kolom, scrol omlaag in kolomeigenschappen naar Sorteren.
  • Stel uw sorteervoorkeur in door “Hoofdlettergevoelig” aan te vinken

Other episodes