SQLite'nin Türkçe karakterler için yerleşik doğru sıralama desteği sınırlıdır ve özellikle "Ğ," "ğ" gibi harflerde sorunlar yaşanabilir. SQLite, varsayılan olarak Türkçe karakterlerin benzersizliğini ve sıralamasını doğru şekilde yapmaz çünkü COLLATE NOCASE gibi standart karşılaştırmalar yalnızca ASCII karakterleri düzgün işler. Bu nedenle, "ORDER BY" kullanıldığında bile Türkçe karakter sıralaması doğru olmayabilir.Bu siteyi türkçeye çevirince böyle bir izahat verdi
Öne çıkan çözüm yolları:
- SQLite ICU collation (ICU kütüphanesi ile Türkçe sıralama desteği) kullanılabilir. SQLite derlemesine ICU desteği ekleyip, Türkçe için özel collation tanımlamak gerekir.
- Tablo veya sorgu düzeyinde COLLATE ifadesi ile Türkçe sıralamaya uygun özel bir collation atanabilir. Ancak bu, SQLite'da standart kurulumda yerleşik değildir ve ekstra yapılandırma gerektirir.
- Veritabanı sorgusundan sonra uygulama tarafında DataView.Sort gibi yöntemlerle Türkçe göre sıralama yapılması (ama siz döngüsüz ve Linq'siz istiyorsunuz).
- .NET tarafında veri çekildikten sonra Türkçe kültüre uygun Comparer kullanarak sıralama yapılabilir; ancak bu döngüsüz olmayabilir.
Sizin örnek kodunuzda;
- "SELECT distinct baslik FROM tblDeneme" sorgusunda DISTINCT, Türkçe karakterlerin benzerlik sorununu çözmüyor çünkü SQLite harfleri tam olarak değerlendiremiyor.
- DataView'a atanan dv.Sort = "baslik ASC" ifadesi aslında Türkçe sıralama sağlıyor gibi görünüyor ama bu da veritabanındaki sıra ile farklı olabilir.
- dv.Table.CaseSensitive = False işlemi yalnızca küçük/büyük harf farkını etkiler, Türkçe karakter sıralama sorununu çözmez.
Bu durumda pratik öneri:
- SQLite veritabanına Türkçe sıralama desteği için ICU collation ekleyin.
- Sorguda COLLATE bölümü ile Türkçe sıralama kullanın, örnek:
HTML:
- Eğer bu mümkün değilse, verileri veritabanından çekerken sıralama yapmadan çekip, VB.NET tarafında DataView'de Sort yaparken Türkçe kültüre uygun CompareInfo kullanan manuel sort fonksiyonu yazmanız gerekir (döngü olmadan mümkün değil).
Özetle: SQLite tek başına tam Türkçe sıralama ve benzersizliği desteklemez. SQLite'a ICU veya özel Turkish collation eklenmesi ya da uygulama tarafında Türkçe sıralama (manuel veya DataView ile) yapılması gerekir.
SQLite bağlantısı açıldıktan sonra özel bir collation ekleyebilirsiniz:
HTML:
- Burada CreateCollation ile TR_NOCASE adında bir collation tanımlıyoruz.
- SQL sorgusunda ORDER BY baslik COLLATE TR_NOCASE diyerek Türkçe’ye uygun sıralama ve benzersizlik sağlıyoruz.
- Böylece hem DISTINCT hem ORDER BY Türkçe karakterleri doğru işler.
Eğer SQLite tarafında collation tanımlamak istemezseniz, DataTable doldurduktan sonra .NET tarafında Distinct işlemini kültüre duyarlı yapabilirsiniz:
HTML:
Ama siz özellikle
LINQ istemiyorum, döngüsüz olacak dediniz; bu yüzden en doğru çözüm
SQLite collation tanımlamak.
Helper Class
Bu sınıfı projenize eklediğinde, her SQLite bağlantısı açıldığında otomatik olarak
Türkçe collation tanımlanır ve sorgularında COLLATE TR_NOCASE kullanarak hem benzersizlik (DISTINCT, GROUP BY) hem de sıralama (ORDER BY) Türkçe’ye uygun hale gelir.
HTML:
Kullanım Örneği
HTML:
Helper Class yine aynı kalıyor
Program Başlangıcında Global Kullanım
Genellikle Sub Main() veya Form_Load gibi uygulamanın ilk çalıştığı noktada çağırırsınız:
HTML:
Artık formda sorgularını şöyle yazabilirsin:
HTML:
- Tek seferlik tanım → Program başında ekleniyor, her bağlantıda tekrar yazmana gerek yok.
- DISTINCT, GROUP BY, ORDER BY → Hepsi Türkçe karakterlere duyarlı hale geliyor.
- Döngüsüz, LINQ’suz → Direkt SQL tarafında çözülüyor.
Global Default Collation Çözümü
1. Helper Class
HTML:
Proğram başlangıcında çağır
HTML:
Artık SQL’de COLLATE yazmana gerek yok
HTML:
Bu sorgu otomatik olarak Türkçe sıralama yapar (Ğ/ğ, İ/i, I/ı gibi harfler doğru şekilde ayırt edilir).
- Tek seferlik tanım → Program başında ekleniyor.
- DISTINCT, GROUP BY, ORDER BY → Hepsi Türkçe karakterlere duyarlı hale geliyor.
- Kısacık SQL → COLLATE TR_NOCASE yazmana gerek kalmıyor.
Size Fikir vermesi açısından yz derlemesi Bilginize sunulur