Rendezés és kis- és nagybetűk érzékenysége

Az adatbázisokban a szövegfeldolgozás összetett lehet, és több felhasználói figyelmet igényel, mint gondolná. Az adatbázisok egyrészt jelentősen eltérnek a szövegkezelés módjától; Például míg egyes adatbázisok alapértelmezés szerint megkülönböztetik a kis- és nagybetűket (például Sqlite, PostgreSQL), mások nem érzékenyek a kis- és nagybetűkre (SQL Server, MySQL). Emellett az indexhasználat miatt a kis- és nagybetűk érzékenysége és hasonló aspektusai messzemenő hatással lehetnek a lekérdezési teljesítményre: bár csábító string.ToLower lehet a kis- és nagybetűket megkülönböztető adatbázisok kis- és nagybetűk közötti összehasonlításának kényszerítése, ez megakadályozhatja, hogy az alkalmazás indexeket használjon. Ez az oldal részletezi, hogyan konfigurálhatja a kis- és nagybetű érzékenységet, vagy általánosabban az összehasonlításokat, és hogyan teheti ezt hatékonyan, a lekérdezési teljesítmény veszélyeztetése nélkül.

Karakterkészlet-rendezés bevezetése

A szövegfeldolgozás alapvető fogalma a rendezés, amely a szövegértékek rendezési és összehasonlítási módját meghatározó szabályok halmaza az egyenlőség szempontjából. Például, míg a kis- és nagybetűket figyelmen kívül hagyó rendezés nem veszi figyelembe a nagy- és kisbetűk különbségét az egyenlőség összehasonlítása során, addig a kis- és nagybetűket megkülönböztető rendezés igen. Mivel azonban a kis- és nagybetűk érzékenysége kultúraérzékeny (például i és I különböző betűket jelölnek törökül), több kis- és nagybetűfüggetlen rendezés létezik, amelyek mindegyike saját szabálykészlettel rendelkezik. A rendezések hatóköre nemcsak a kis- és nagybetűk érzékenységére, hanem a karakteradatok egyéb aspektusaira is kiterjed; például a német nyelvben néha (de nem mindig) kívánatos néha azonosként kezelni a ä-t és ae-t. Végül a kollációk meghatározzák, hogyan vannak rendezve a szövegértékek: míg a német ä az a után következik, addig a svéd az ábécé végére helyezi.

Az adatbázis összes szöveges művelete – akár explicit, akár implicit módon – egy kollációt használ, hogy meghatározza, miként hasonlítja össze és rendezi a sztringeket. Az elérhető rendezések és elnevezési sémák tényleges listája adatbázis-specifikus; a különböző adatbázisok releváns dokumentációs lapjaira mutató hivatkozásokért tekintse meg az alábbi szakaszt . Szerencsére az adatbázisok általában lehetővé teszik az alapértelmezett rendezés meghatározását az adatbázis vagy az oszlop szintjén, és explicit módon megadják, hogy melyik rendezést kell használni egy lekérdezés adott műveleteihez.

Adatbázis összevetése

A legtöbb adatbázisrendszerben az alapértelmezett rendezés az adatbázis szintjén van definiálva; kivéve, ha felülbírált, ez a rendezés implicit módon vonatkozik az adatbázisban előforduló összes szövegműveletre. Az adatbázis-rendezés általában az adatbázis létrehozásakor (a CREATE DATABASE DDL utasításon keresztül) van beállítva, és ha nincs megadva, akkor az alapértelmezett érték egy bizonyos kiszolgálószintű érték, amelyet a beállításkor határoznak meg. Az SQL Server alapértelmezett kiszolgálószintű kódolása például az "Angol (Egyesült Államok)" gépi területi SQL_Latin1_General_CP1_CI_AS beállításában van, amely egy kis- és nagybetűket nem megkülönböztető, ékezetérzékeny kódolás. Bár az adatbázisrendszerek általában lehetővé teszik egy meglévő adatbázis rendszerezésének módosítását, ez komplikációkhoz vezethet; javasoljuk, hogy válasszon egy rendezést az adatbázis létrehozása előtt.

Ha EF Core-migrálásokat használ az adatbázisséma kezeléséhez, a modell metódusában OnModelCreating az alábbiak konfigurálják az SQL Server-adatbázist a kis- és nagybetűk megkülönböztetésére:

modelBuilder.UseCollation("SQL_Latin1_General_CP1_CS_AS");

Oszlop rendezés

A kolláció szövegoszlopokon is meghatározható, felülírva az adatbázis alapértelmezett beállítását. Ez akkor lehet hasznos, ha bizonyos oszlopoknak nem szabad érzékenynek lenniük a nagybetűk használatára, míg az adatbázis többi részének meg kell különböztetnie a kis- és nagybetűket.

Ha az EF Core migrációkat használja az adatbázis séma kezelésére, az alábbiak a Name tulajdonság oszlopát úgy konfigurálják, hogy az kis- és nagybetűkre érzéketlen legyen egy alapértelmezés szerint kis- és nagybetűkre érzékeny adatbázisban.

modelBuilder.Entity<Customer>().Property(c => c.Name)
    .UseCollation("SQL_Latin1_General_CP1_CI_AS");

Kifejezett rendezés egy lekérdezésben

Bizonyos esetekben ugyanazt az oszlopot különböző lekérdezések különböző rendezésekkel kell lekérdezni. Előfordulhat például, hogy egy lekérdezésnek kis- és nagybetűkre érzékeny összehasonlítást kell végeznie egy oszlopon, míg egy másiknak kis- és nagybetűkre nem érzékeny összehasonlítást kell végeznie ugyanazon az oszlopon. Ez úgy érhető el, hogy explicit módon megad egy rendezést magában a lekérdezésben:

var customers = await context.Customers
    .Where(c => EF.Functions.Collate(c.Name, "SQL_Latin1_General_CP1_CS_AS") == "John")
    .ToListAsync();

Ez létrehoz egy COLLATE záradékot az SQL-lekérdezésben, amely egy kis- és nagybetű érzékeny rendezést alkalmaz, függetlenül az oszlop vagy az adatbázis szintjén definiált rendezéstől.

SELECT [c].[Id], [c].[Name]
FROM [Customers] AS [c]
WHERE [c].[Name] COLLATE SQL_Latin1_General_CP1_CS_AS = N'John'

Explicit rendezések és indexek

Az indexek az adatbázis teljesítményének egyik legfontosabb tényezője – az indexekkel hatékonyan futtatott lekérdezések az index nélkül is megállhatnak. Az indexek implicit módon öröklik az oszlopuk rendezést; Ez azt jelenti, hogy az oszlop összes lekérdezése automatikusan jogosult az adott oszlopban definiált indexek használatára – feltéve, hogy a lekérdezés nem ad meg másik rendezést. Ha explicit rendezést ad meg egy lekérdezésben, az általában megakadályozza, hogy a lekérdezés az adott oszlopban meghatározott indexet használjon, mivel a rendezések már nem egyeznek; ezért javasoljuk, hogy körültekintően járjon el a funkció használatakor. Mindig célszerű az oszlop (vagy adatbázis) szintjén meghatározni a rendezést, amely lehetővé teszi, hogy minden lekérdezés implicit módon használja ezt a rendezést, és kihasználhassa az indexek előnyeit.

Vegye figyelembe, hogy egyes adatbázisok lehetővé teszik a rendezés definiálását egy index létrehozásakor (pl. PostgreSQL, Sqlite). Ez lehetővé teszi több index definiálását ugyanazon az oszlopon, felgyorsítva a különböző összehasonlítású műveleteket (például kis- és nagybetű érzékeny, valamint kis- és nagybetű érzéketlen összehasonlításokat). További részletekért tekintse meg az adatbázis-szolgáltató dokumentációját.

Figyelmeztetés

Mindig vizsgálja meg a lekérdezések lekérdezési terveit, és győződjön meg arról, hogy a megfelelő indexek vannak használatban a nagy mennyiségű adatot végrehajtó, teljesítmény szempontjából kritikus fontosságú lekérdezésekben. A lekérdezésekben a kis- és nagybetűk érzékenységének felülírása a EF.Functions.Collate (vagy a string.ToLower meghívásával) nagyon jelentős hatással lehet az alkalmazás teljesítményére.

Beépített .NET-sztringműveletek fordítása

A .NET-ben a karakterláncok egyenlősége alapértelmezés szerint kis- és nagybetűérzékeny: s1 == s2 egy ordinális összehasonlítást végez, amely megköveteli, hogy a karakterláncok azonosak legyenek. Mivel az adatbázisok alapértelmezett rendezése eltérő, és mivel az egyszerű egyenlőséghez indexek használata kívánatos, az EF Core nem tesz kísérletet az egyszerű egyenlőség adatbázis-kis- és nagybetű érzékeny műveletre való lefordítására: a C# egyenlőséget közvetlenül az SQL egyenlőségére fordítja le, amely attól függően, hogy a konkrét adatbázis és a rendezési konfiguráció hogyan van beállítva, lehet kis- és nagybetű érzékeny vagy sem.

A .NET emellett túlterheléseket kínál az string.Equals számára, amelyek elfogadnak egy StringComparison enumot, ezzel megadható, hogy az összehasonlításhoz figyelembe vegye-e a kis- és nagybetűket, és megadható a kultúra is. Az EF Core a tervezés során tartózkodik attól, hogy ezeket a túlterheléseket SQL-re fordítsa, és a használatuk megkísérlése kivételt eredményez. Ami azt illeti, az EF Core nem tudja, hogy kis- és nagybetűket megkülönböztető vagy ezekkel szemben érzéketlen rendezést kellene-e alkalmazni. Ennél is fontosabb, hogy a rendezés alkalmazása a legtöbb esetben megakadályozza az index használatát, ami jelentősen befolyásolja egy nagyon alapszintű és gyakran használt .NET-szerkezet teljesítményét. Ha egy lekérdezést a kis- és nagybetűk megkülönböztetésére vagy a kis- és nagybetűk érzéketlen összehasonlítására szeretne kényszeríteni, adjon meg explicit módon EF.Functions.Collate egy rendezést a fent részletezett módon.

További erőforrások

Adatbázis-specifikus információk

Egyéb erőforrások