Harmanlamalar ve büyük küçük harf duyarlılığıCollations and Case Sensitivity

Not

Bu özellik EF Core 5,0 ' de kullanıma sunulmuştur.This feature is introduced in EF Core 5.0.

Veritabanlarında metin işleme karmaşık olabilir ve bunun şüpheli olması için daha fazla Kullanıcı ilgilenmesini gerektirir.Text processing in databases can be a complex, and requires more user attention that one would suspect. Tek bir şey için veritabanları, metnin nasıl ele alınacağını önemli ölçüde farklılık gösterir. Örneğin, bazı veritabanları varsayılan olarak büyük/küçük harfe duyarlıdır (örn. SQLite, PostgreSQL), diğerleri büyük/küçük harfe duyarsızdır (SQL Server, MySQL).For one thing, databases vary considerably in how they handle text; for example, while some databases are case-sensitive by default (e.g. Sqlite, PostgreSQL), others are case-insensitive (SQL Server, MySQL). Ayrıca, dizin kullanımı, büyük/küçük harf duyarlılığı ve benzer yönler, sorgu performansı üzerinde string.Lower büyük/küçük harfe duyarsız bir karşılaştırmayı zorlamak için kullanılması mümkün olsa da, büyük/küçük harfe duyarlı bir veritabanında büyük/küçük harfe duyarsız bir karşılaştırmaya zorlamak için kullanılması mümkün olsa da uygulamanızın dizinleri kullanmasını engelleyebilir.In addition, because of index usage, case-sensitivity and similar aspects can have a far-reaching impact on query performance: while it may be tempting to use string.Lower to force a case-insensitive comparison in a case-sensitive database, doing so may prevent your application from using indexes. Bu sayfada büyük/küçük harf duyarlılığı veya daha genel, harmanlamalar yapılandırma ve sorgu performansından ödün vermeden etkili bir şekilde nasıl yapılacağı hakkında bilgi sağlanır.This page details how to configure case sensitivity, or more generally, collations, and how to do so in an efficient way without compromising query performance.

Harmanlamalara girişIntroduction to collations

Metin işlemede temel bir kavram harmanlama, metin değerlerinin nasıl sıralandığına ve eşitlik için nasıl karşılaştırıldığını belirleyen bir kurallar kümesidir.A fundamental concept in text processing is the collation, which is a set of rules determining how text values are ordered and compared for equality. Örneğin, büyük/küçük harfe duyarsız bir harmanlama, eşitlik karşılaştırması amacıyla büyük ve küçük harfler arasındaki farkları kabul etmez, büyük/küçük harfe duyarlı harmanlama değildir.For example, while a case-insensitive collation disregards differences between upper- and lower-case letters for the purposes of equality comparison, a case-sensitive collation does not. Ancak, büyük/küçük harf duyarlılığı kültüre duyarlı olduğundan (örneğin, i I Türkçe 'de farklı bir harf temsil ettiğinden), her biri kendi kural kümesine sahip birden fazla büyük küçük harfe duyarsız harmanlama mevcuttur.However, since case-sensitivity is culture-sensitive (e.g. i and I represent different letter in Turkish), there exist multiple case-insensitive collations, each with its own set of rules. Harmanlamalar kapsamı, büyük/küçük harf duyarlılığı yerine karakter verilerinin diğer yönlerini de uzatır; Almanya 'da Örneğin, bazen (her zaman değil), ä aynı şekilde ve aynı şekilde ele alınır ae .The scope of collations also extends beyond case-sensitivity, to other aspects of character data; in German, for example, it is sometimes (but not always) desirable to treat ä and ae as identical. Son olarak, harmanlamalar metin değerlerinin sıralanmabiçimini de tanımlar: Almanca ä sonra a , İsveç, alfabeden sonuna yer koyar.Finally, collations also define how text values are ordered: while German places ä after a, Swedish places it at the end of the alphabet.

Bir veritabanındaki tüm metin işlemleri, işlemin nasıl Karşılaştırıldığı ve sıraladığı, açıkça veya örtük olarak yapılıp yapılmayacağını belirleme şeklinde harmanlama kullanır.All text operations in a database use a collation - whether explicitly or implicitly - to determine how the operation compares and orders strings. Kullanılabilir harmanlamalar ve adlandırma düzenlerinin gerçek listesi veritabanına özgüdür; çeşitli veritabanlarının ilgili belge sayfalarının bağlantıları için aşağıdaki bölüme bakın.The actual list of available collations and their naming schemes is database-specific; consult the section below for links to relevant documentation pages of various databases. Neyse ki veritabanı genellikle veritabanı veya sütun düzeyinde bir varsayılan harmanlamanın tanımlanmasına ve bir sorgudaki belirli işlemler için hangi harmanlamanın kullanılması gerektiğini açıkça belirtmektir.Fortunately, database do generally allow a default collation to be defined at the database or column level, and to explicitly specify which collation should be use for specific operations in a query.

Veritabanı harmanlamasıDatabase collation

Çoğu veritabanı sisteminde, veritabanı düzeyinde varsayılan harmanlama tanımlanır; geçersiz kılınmadığı takdirde, harmanlama bu veritabanı içinde oluşan tüm metin işlemlerine örtük olarak uygulanır.In most database systems, a default collation is defined at the database level; unless overridden, that collation implicitly applies to all text operations occurring within that database. Veritabanı harmanlaması genellikle veritabanı oluşturma zamanında ( CREATE DATABASE DDL ekstresi aracılığıyla) ayarlanır ve belirtilmemişse, varsayılan olarak kurulum zamanında belirlenen bir sunucu düzeyi değeri alır.The database collation is typically set at database creation time (via the CREATE DATABASE DDL statement), and if not specified, defaults to a some server-level value determined at setup time. Örneğin, SQL Server ' deki varsayılan sunucu düzeyi harmanlama, SQL_Latin1_General_CP1_CI_AS büyük/küçük harfe duyarsız, aksan duyarlı harmanlama olan.For example, the default server-level collation in SQL Server is SQL_Latin1_General_CP1_CI_AS, which is a case-insensitive, accent-sensitive collation. Veritabanı sistemleri genellikle var olan bir veritabanının harmanlanmasını değiştirmeye izin verse de, bunun yapılması karmaşıklıklara yol açabilir; veritabanı oluşturmadan önce bir harmanlama seçmeniz önerilir.Although database systems usually do permit altering the collation of an existing database, doing so can lead to complications; it is recommended to pick a collation before database creation.

Veritabanı şemanızı yönetmek için EF Core geçişleri kullanırken, modelinizin yönteminde aşağıdakiler, OnModelCreating büyük/küçük harfe duyarlı harmanlama kullanmak için bir SQL Server veritabanı yapılandırır:When using EF Core migrations to manage your database schema, the following in your model's OnModelCreating method configures a SQL Server database to use a case-sensitive collation:

modelBuilder.UseCollation("SQL_Latin1_General_CP1_CS_AS");

Sütun harmanlamaColumn collation

Harmanlamalar Ayrıca, metin sütunlarında tanımlanabilir ve veritabanı varsayılanını geçersiz kılar.Collations can also be defined on text columns, overriding the database default. Bu, belirli sütunların büyük/küçük harfe duyarsız olması gerekiyorsa yararlı olabilir, ancak veritabanının geri kalanı büyük/küçük harfe duyarlı olmalıdır.This can be useful if certain columns need to be case-insensitive, while the rest of the database needs to be case-sensitive.

Veritabanı şemanızı yönetmek için EF Core geçişleri kullanırken aşağıdaki, özelliği için sütunu, Name Aksi durumda büyük/küçük harfe duyarlı olacak şekilde yapılandırılmış bir veritabanında büyük küçük harfe duyarsız olacak şekilde yapılandırır:When using EF Core migrations to manage your database schema, the following configures the column for the Name property to be case-insensitive in a database that is otherwise configured to be case-sensitive:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.UseCollation("SQL_Latin1_General_CP1_CS_AS");

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

Sorguda açık harmanlamaExplicit collation in a query

Bazı durumlarda, aynı sütunun farklı sorgular tarafından Farklı harmanlamalar kullanılarak sorgulanması gerekir.In some cases, the same column needs to be queried using different collations by different queries. Örneğin, bir sorgunun bir sütunda büyük/küçük harfe duyarlı bir karşılaştırma gerçekleştirmesi gerekebilir, diğer bir deyişle, aynı sütunda büyük/küçük harf duyarsız bir karşılaştırma gerçekleştirmeniz gerekebilir.For example, one query may need to perform a case-sensitive comparison on a column, while another may need to perform a case-insensitive comparison on the same column. Bu, açıkça sorgunun kendisi içinde harmanlama belirtilerek gerçekleştirilebilir:This can be accomplished by explicitly specifying a collation within the query itself:

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

Bu, COLLATE sütun veya veritabanı düzeyinde tanımlanan harmanlamadan bağımsız olarak büyük/küçük harfe duyarlı harmanlama uygulayan SQL sorgusunda bir yan tümce oluşturur:This generates a COLLATE clause in the SQL query, which applies a case-sensitive collation regardless of the collation defined at the column or database level:

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

Açık harmanlamalar ve dizinlerExplicit collations and indexes

Dizinler, veritabanı performansındaki en önemli faktörlerden biridir. bir dizinle etkin şekilde çalışan bir sorgu, bu dizin olmadan bir durdurmak için korunmamıza olabilir.Indexes are one of the most important factors in database performance - a query that runs efficiently with an index can grind to a halt without that index. Dizinler, kendi sütun harmanlamalarını örtülü olarak miras alır; Bu, sütundaki tüm sorguların otomatik olarak söz konusu sütunda tanımlanan dizinleri kullanmasına uygun olduğu anlamına gelir. sorgu farklı bir harmanlama belirtmediği belirtildi.Indexes implicitly inherit the collation of their column; this means that all queries on the column are automatically eligible to use indexes defined on that column - provided that the query doesn't specify a different collation. Bir sorguda açık harmanlama belirtmek genellikle bu sorgunun bu sütunda tanımlı bir dizin kullanmasını engeller; çünkü harmanlamalar artık eşleşmeyecektir; Bu nedenle, bu özelliği kullanırken dikkatli olmanız önerilir.Specifying an explicit collation in a query will generally prevent that query from using an index defined on that column, since the collations would no longer match; it is therefore recommended to exercise caution when using this feature. Her zaman, sütun (veya veritabanı) düzeyinde harmanlama tanımlamak tercih edilir. Bu, tüm sorguların örtülü olarak bu harmanlamayı ve herhangi bir dizinden faydalanmasını sağlar.It is always preferable to define the collation at the column (or database) level, allowing all queries to implicitly use that collation and benefit from any index.

Bazı veritabanlarının bir dizin oluştururken harmanlama tanımlandığına (ör. PostgreSQL, SQLite) izin verdiğine unutmayın.Note that some databases allow the collation to be defined when creating an index (e.g. PostgreSQL, Sqlite). Bu, birden çok dizinin aynı sütunda tanımlanmasını sağlar, farklı harmanlamalarla işlemleri hızlandırın (ör. büyük/küçük harfe duyarlı ve büyük/küçük harfe duyarsız karşılaştırmalar).This allows multiple indexes to be defined on the same column, speeding up operations with different collations (e.g. both case-sensitive and case-insensitive comparisons). Daha fazla bilgi için veritabanı sağlayıcınızın belgelerine başvurun.Consult your database provider's documentation for more details.

Uyarı

Sorgularınızın sorgu planlarını her zaman inceleyin ve büyük miktarlarda veri üzerinde yürütülen performans açısından kritik sorgularda uygun dizinlerin kullanıldığından emin olun.Always inspect the query plans of your queries, and make sure the proper indexes are being used in performance-critical queries executing over large amounts of data. Bir sorgudaki (veya çağırarak) büyük/küçük harf duyarlılığını geçersiz kılmak EF.Functions.Collate string.ToLower uygulamanızın performansına çok önemli bir etkiye sahip olabilir.Overriding case-sensitivity in a query via EF.Functions.Collate (or by calling string.ToLower) can have a very significant impact on your application's performance.

Yerleşik .NET dize işlemlerinin çevirisiTranslation of built-in .NET string operations

.NET ' te dize eşitlik, varsayılan olarak büyük/küçük harfe duyarlıdır: s1 == s2 dizelerin özdeş olmasını gerektiren sıralı bir karşılaştırma gerçekleştirir.In .NET, string equality is case-sensitive by default: s1 == s2 performs an ordinal comparison that requires the strings to be identical. Veritabanlarının varsayılan harmanlaması değiştiğinden ve basit eşitlik 'in Dizin kullanması isteneceği için EF Core, basit eşitliği bir veritabanı küçük harfe duyarlı bir işleme çevirmeye yönelik değildir. C# eşitlik, kullanımdaki belirli veritabanına ve harmanlama yapılandırmasına bağlı olarak, büyük/küçük harfe duyarlı olmayan bir şekilde doğrudan SQL eşitliğine çevrilir.Because the default collation of databases varies, and because it is desirable for simple equality to use indexes, EF Core makes no attempt to translate simple equality to a database case-sensitive operation: C# equality is translated directly to SQL equality, which may or may not be case-sensitive, depending on the specific database in use and its collation configuration.

Ayrıca, .NET, string.Equals StringComparison karşılaştırma için büyük/küçük harf duyarlılığı ve kültür belirtilmesine izin veren bir sabit listesi kabul eden aşırı yüklemeler sağlar.In addition, .NET provides overloads of string.Equals accepting a StringComparison enum, which allows specifying case-sensitivity and culture for the comparison. Tasarım yaparak EF Core, bu aşırı yüklemeleri SQL 'e çevirdiğinizden ve bunları kullanmaya çalışılması bir özel durumla sonuçlanacaktır.By design, EF Core refrains from translating these overloads to SQL, and attempting to use them will result in an exception. Tek bir şey için EF Core, büyük/küçük harf duyarlı veya büyük/küçük harfe duyarsız harmanlama kullanılması gerektiğini bilmez.For one thing, EF Core does know not which case-sensitive or case-insensitive collation should be used. Daha önemlisi, harmanlama uygulamak çoğu durumda dizin kullanımını engeller ve çok temel ve yaygın olarak kullanılan .NET yapısına yönelik performansı önemli ölçüde etkiler.More importantly, applying a collation would in most cases prevent index usage, significantly impacting performance for a very basic and commonly-used .NET construct. Bir sorguyu büyük küçük harfe duyarlı veya büyük/küçük harfe duyarsız karşılaştırma kullanacak şekilde zorlamak için, EF.Functions.Collate yukarıda ayrıntılarıylaaçıklandığı gibi bir harmanlamayı açıkça belirtin.To force a query to use case-sensitive or case-insensitive comparison, specify a collation explicitly via EF.Functions.Collate as detailed above.

Veritabanına özgü bilgilerDatabase-specific information