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_AS
bepaalt 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 like
ook 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 like
heeft 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