Aracılığıyla paylaş


Harmanlamalar ve Büyük/Küçük Harf Duyarlılığı

Veritabanlarında metin işleme karmaşık olabilir ve birden fazla kullanıcının dikkatine ihtiyaç duyar. Veritabanları, metin işleme şekli açısından önemli ölçüde farklılık gösterir; örneğin, bazı veritabanları varsayılan olarak büyük/küçük harfe duyarlı olsa da (örneğin Sqlite, PostgreSQL), diğerleri büyük/küçük harfe duyarlı değildir (SQL Server, MySQL). Ayrıca, dizin kullanımı nedeniyle büyük/küçük harf duyarlılığı ve benzer yönleri sorgu performansı üzerinde çok büyük/küçük harf etkisi oluşturabilir: Büyük/küçük harfe duyarlı bir veritabanında büyük/küçük harfe duyarlı olmayan bir karşılaştırmayı string.ToLower zorlamak cazip olsa da, bunu yapmak uygulamanızın dizinleri kullanmasını engelleyebilir. Bu sayfada büyük/küçük harf duyarlılığının veya daha genel olarak harmanlamaların nasıl yapılandırılıp sorgu performansından ödün verilmeden verimli bir şekilde nasıl yapılacağı ayrıntılı olarak anlatılır.

Harmanlamalara giriş

Metin işlemedeki temel kavramlardan biri, metin değerlerinin eşitlik için nasıl sıralandığını ve karşılaştırılmasını belirleyen bir dizi kural olan harmanlamadır. Örneğin, büyük/küçük harfe duyarsız harmanlama, eşitlik karşılaştırması amacıyla büyük ve küçük harf arasındaki farkları göz ardı ederken, büyük/küçük harfe duyarlı harmanlama bunu yapmaz. Ancak büyük/küçük harf duyarlılığı kültüre duyarlı olduğundan (örneğin iI , Türkçede farklı harfleri temsil ettiğinden), her biri kendi kuralları olan birden çok büyük/küçük harfe duyarlı olmayan harmanlama vardır. Harmanlamaların kapsamı büyük/küçük harf duyarlılığının ötesine, karakter verilerinin diğer yönlerine de genişletir; Örneğin, Almanca olarak, bazen (ancak her zaman değil) tedavi ä etmek ve ae aynı olarak tercih edilir. Son olarak harmanlamalar, metin değerlerinin nasıl sıralı olduğunu da tanımlar: sonra Almanca yer alırken äa, İsveççe alfabenin sonuna yerleştirir.

Veritabanındaki tüm metin işlemleri, işlemin dizeleri nasıl karşılaştırdığını ve sıralamasını belirlemek için açıkça veya örtük olarak harmanlama kullanır. Kullanılabilir harmanlamaların ve bunların adlandırma düzenlerinin gerçek listesi veritabanına özgüdür; çeşitli veritabanlarının ilgili belge sayfalarına bağlantılar için aşağıdaki bölüme bakın. Neyse ki veritabanları genellikle veritabanı veya sütun düzeyinde varsayılan harmanlamanın tanımlanmasına ve sorgudaki belirli işlemler için hangi harmanlamanın kullanılacağını açıkça belirtmeye izin verir.

Veritabanı harmanlaması

Çoğu veritabanı sisteminde, veritabanı düzeyinde varsayılan harmanlama tanımlanır; geçersiz kılınmadığı sürece, bu harmanlama örtük olarak bu veritabanında gerçekleşen tüm metin işlemleri için geçerlidir. Veritabanı harmanlaması genellikle veritabanı oluşturma zamanında (DDL deyimi aracılığıyla CREATE DATABASE ) ayarlanır ve belirtilmezse, varsayılan olarak kurulum zamanında belirlenen sunucu düzeyinde bir değere ayarlanır. Örneğin, SQL Server'da "İngilizce (Birleşik Devletler)" makine yerel ayarı için varsayılan sunucu düzeyinde harmanlama, SQL_Latin1_General_CP1_CI_ASbüyük/küçük harfe duyarlı olmayan, vurguya duyarlı bir harmanlamadır. Veritabanı sistemleri genellikle mevcut bir veritabanının harmanlamasını değiştirmeye izin verse de, bunu yapmak komplikasyonlara yol açabilir; veritabanı oluşturmadan önce harmanlama seçmeniz önerilir.

Veritabanı şemanızı yönetmek için EF Core geçişlerini kullanırken, modelinizin OnModelCreating yönteminde aşağıdakiler bir SQL Server veritabanını büyük/küçük harfe duyarlı harmanlama kullanacak şekilde yapılandırıyor:

modelBuilder.UseCollation("SQL_Latin1_General_CP1_CS_AS");

Sütun harmanlama

Harmanlamalar, veritabanı varsayılanı geçersiz kılınarak metin sütunlarında da tanımlanabilir. Bu, belirli sütunların büyük/küçük harfe duyarlı olması ve veritabanının geri kalanının büyük/küçük harfe duyarlı olması gerekiyorsa yararlı olabilir.

Veritabanı şemanızı yönetmek için EF Core geçişlerini kullanırken, aşağıdakiler özelliğin sütununu Name büyük/küçük harfe duyarlı olacak şekilde yapılandırılmış bir veritabanında büyük/küçük harfe duyarlı olmayacak şekilde yapılandırmaktadır:

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

Sorguda açık harmanlama

Bazı durumlarda, aynı sütunun farklı sorgular tarafından farklı harmanlamalar kullanılarak sorgulanması gerekir. Örneğin, bir sorgunun bir sütunda büyük/küçük harfe duyarlı karşılaştırma gerçekleştirmesi gerekebilirken, başka bir sorgunun aynı sütunda büyük/küçük harfe duyarlı olmayan bir karşılaştırma gerçekleştirmesi gerekebilir. Bu, sorgunun kendi içinde açıkça bir harmanlama belirtilerek gerçekleştirilebilir:

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

Bu, SQL sorgusunda sütun COLLATE veya veritabanı düzeyinde tanımlanan harmanlamadan bağımsız olarak büyük/küçük harfe duyarlı harmanlama uygulayan bir yan tümce oluşturur:

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 dizinler

Dizinler, veritabanı performansındaki en önemli faktörlerden biridir. Dizinle verimli bir şekilde çalışan bir sorgu, bu dizin olmadan durma noktasına gelebilir. Dizinler, sütunlarının harmanlamasını örtük olarak devralır; bu, sorgunun farklı bir harmanlama belirtmemesi koşuluyla sütundaki tüm sorguların bu sütunda tanımlanan dizinleri kullanmaya otomatik olarak uygun olduğu anlamına gelir. Bir sorguda açık harmanlama belirtilmesi genellikle harmanlamalar artık eşleşmeyeceğinden bu sorgunun bu sütunda tanımlanmış bir dizin kullanmasını engeller; Bu nedenle bu özelliği kullanırken dikkatli olmanız önerilir. Harmanlamanın sütun (veya veritabanı) düzeyinde tanımlanması her zaman tercih edilir; böylece tüm sorgular bu harmanlamayı örtük olarak kullanabilir ve herhangi bir dizinden yararlanabilir.

Bazı veritabanlarının, dizin oluştururken harmanlamanın tanımlanmasına izin verileceğine dikkat edin (örneğin, PostgreSQL, Sqlite). Bu, aynı sütunda birden çok dizinin tanımlanmasına olanak tanır ve farklı harmanlamalarla (örn. hem büyük/küçük harfe duyarlı hem de büyük/küçük harfe duyarlı olmayan karşılaştırmalar) işlemleri hızlandırmaktadır. Daha fazla ayrıntı için veritabanı sağlayıcınıza başvurun.

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. Aracılığıyla (veya çağırarakstring.ToLower) bir sorgudaki EF.Functions.Collate büyük/küçük harf duyarlılığını geçersiz kılma, uygulamanızın performansı üzerinde çok önemli bir etkiye sahip olabilir.

Yerleşik .NET dize işlemlerinin çevirisi

.NET'te dize eşitliği varsayılan olarak büyük/küçük harfe duyarlıdır: s1 == s2 Dizelerin aynı olmasını gerektiren sıralı bir karşılaştırma gerçekleştirir. Veritabanlarının varsayılan harmanlaması farklılık gösterdiğinden ve basit eşitliğin dizinleri kullanması istendiğinden EF Core, basit eşitliği büyük/küçük harfe duyarlı bir işleme çevirme girişiminde bulunmaz: C# eşitliği, kullanımdaki belirli veritabanına ve harmanlama yapılandırmasına bağlı olarak doğrudan SQL eşitliğine çevrilir ve büyük/küçük harfe duyarlı olabilir veya olmayabilir.

Buna ek olarak, .NET bir sabit listesi kabul etme StringComparison aşırı yüklemeleri string.Equals sağlar ve bu da karşılaştırma için büyük/küçük harf duyarlılığı ve kültür belirtmeye olanak tanır. Tasarım gereği EF Core, bu aşırı yüklemeleri SQL'e çevirmekten kaçınıyor ve bunları kullanmaya çalışmak bir özel durumla sonuçlanacak. Ef Core, hangi büyük/küçük harfe duyarlı veya büyük/küçük harfe duyarlı olmayan harmanlama kullanılması gerektiğini bilmez. Daha da önemlisi, harmanlama uygulamak çoğu durumda dizin kullanımını engeller ve çok temel ve yaygın olarak kullanılan bir .NET yapısı için performansı önemli ölçüde etkiler. Bir sorguyu büyük/küçük harfe duyarlı veya büyük/küçük harfe duyarlı olmayan karşılaştırma kullanmaya zorlamak için yukarıda açıklandığı gibi aracılığıyla EF.Functions.Collate açıkça bir harmanlama belirtin.

Ek kaynaklar

Veritabanına özgü bilgiler

Diğer kaynaklar