• DİKKAT !

    Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak Dosya Yükleme tamamen ücretsizdir.

Soru Vb.net ile SQLite de Türkçe karakter sorunu sıralamada.Benzersizde olmuyor

Refaz

Destek Ekibi
Katılım
11 Ağu 2021
Mesajlar
5,189
Çözümler
661
Aldığı beğeni
5,086
Excel V
Office 2024 TR
Konu Sahibi
Merhaba.

Başlıktada yazdığım gibi vb.net ile sqlite ile veri çekince Türkçe karakterler resimdeki gibi benzersiz olmuyor mesela Ğ,ğ gibi.

Order by ilede nedense olmuyor dv.Sort = "baslik ASC" böyle yazınca Türkçe karakterler doğru sıralanıyor.Linq ile olmayacak ve döngüsüz olması gerek.Koduda zaten yapay zeka yazdı.

Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.

Screenshot 2025-11-20 200031.png

HTML:
C#:
İçeriği görebilmek için Giriş yap ya da Üye ol.
 
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.

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:

  1. SQLite veritabanına Türkçe sıralama desteği için ICU collation ekleyin.
  2. Sorguda COLLATE bölümü ile Türkçe sıralama kullanın, örnek:

    HTML:
    Kod:
    İçeriği görebilmek için Giriş yap ya da Üye ol.
  1. 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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
  • 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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Kullanım Örneği
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.


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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Artık formda sorgularını şöyle yazabilirsin:
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

  • 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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Proğram başlangıcında çağır
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Artık SQL’de COLLATE yazmana gerek yok
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

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
 
Sevgili Zafer kardeşim ;
kodu çok güzel yapılandırmışsın. Ancak distinct veya group by kullanıldığında SQLite, varsayılan olarak büyük/küçük harf farklarını dikkate alır. Bu da Ğ ,ğ, I , ı gibi sonuçlara yol açar.
collate nocase büyük/küçük harf duyarlılığını kaldırır ama Türkçeye özel karakterleri (Ğ, İ, Ş, ı, ğ) doğru işlemez
SQLite kurulu değil deneyemiyorum kodun ilgili kısmını bu şekilde revize edip dener misin.

HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
 
Konu Sahibi
Sevgili Zafer kardeşim ;
kodu çok güzel yapılandırmışsın. Ancak distinct veya group by kullanıldığında SQLite, varsayılan olarak büyük/küçük harf farklarını dikkate alır. Bu da Ğ ,ğ, I , ı gibi sonuçlara yol açar.
collate nocase büyük/küçük harf duyarlılığını kaldırır ama Türkçeye özel karakterleri (Ğ, İ, Ş, ı, ğ) doğru işlemez
SQLite kurulu değil deneyemiyorum kodun ilgili kısmını bu şekilde revize edip dener misin.

HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
Sağol Ali hocam akşama doğru deneyeceğim inşaAllah.Ama döngüsüz lazımdı.Yapay zekada aslında linq ile güzel kod yazıp çalışmıştı.
 
Konu Sahibi
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.

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:

  1. SQLite veritabanına Türkçe sıralama desteği için ICU collation ekleyin.
  2. Sorguda COLLATE bölümü ile Türkçe sıralama kullanın, örnek:

    HTML:
    Kod:
    İçeriği görebilmek için Giriş yap ya da Üye ol.
  3. 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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
  • 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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Kullanım Örneği
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.


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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Artık formda sorgularını şöyle yazabilirsin:
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

  • 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:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Proğram başlangıcında çağır
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Artık SQL’de COLLATE yazmana gerek yok
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

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
Merhaba.Yapay zekada aynı bu kodları yazmıştı ama bir türlü yazdığım ve CreateCollation burda hata vermişti yapmadığımda kalmamıştı dll yüklemek vs... Mümkünse dosyayı paylaşırsanız bir deneyeyim.
 
. CreateCollation metodu yalnızca System.Data.SQLite paketinde mevcut; Microsoft.Data.Sqlite (yeni .NET Core uyumlu sürüm) içinde yok. Bu yüzden siz hangi DLL’i kullandığınıza bağlı olarak hata alıyorsunuz.

Yani hem LINQ kullanmadan, hem de For Each / döngü olmadan Türkçe harfleri doğru şekilde büyük/küçük harf duyarsız olarak DISTINCT veya GROUP BY yapmak istiyorsunuz.

Bunu yalnızca SQLite tarafında özel COLLATION tanımlayarak çözebilirsiniz. Çünkü SQLite’ın varsayılan NOCASE sadece ASCII harfleri kapsıyor. Döngüsüz ve LINQ’suz çözüm için tek yol, SQL sorgusunun kendisinin doğru karşılaştırmayı yapmasıdır.

C# tarafında SQLiteConnection.CreateCollation ile Türkçe’ye uygun bir karşılaştırma fonksiyonu ekleyebilirsiniz. Örneğin:
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

  • CreateCollation("TR_NOCASE", ...) ile SQLite’a yeni bir karşılaştırma kuralı ekleniyor.
  • Bu kural String.Compare + CultureInfo("tr-TR") kullanarak Türkçe harfleri doğru şekilde eşleştiriyor (İ ↔ i, I ↔ ı, Ğ ↔ ğ, Ş ↔ ş).
  • SQL tarafında COLLATE TR_NOCASE yazdığınızda artık döngüsüz ve LINQ’suz şekilde doğru DISTINCT veya GROUP BY sonucu alıyorsunuz.
 
Konu Sahibi
. CreateCollation metodu yalnızca System.Data.SQLite paketinde mevcut; Microsoft.Data.Sqlite (yeni .NET Core uyumlu sürüm) içinde yok. Bu yüzden siz hangi DLL’i kullandığınıza bağlı olarak hata alıyorsunuz.

Yani hem LINQ kullanmadan, hem de For Each / döngü olmadan Türkçe harfleri doğru şekilde büyük/küçük harf duyarsız olarak DISTINCT veya GROUP BY yapmak istiyorsunuz.

Bunu yalnızca SQLite tarafında özel COLLATION tanımlayarak çözebilirsiniz. Çünkü SQLite’ın varsayılan NOCASE sadece ASCII harfleri kapsıyor. Döngüsüz ve LINQ’suz çözüm için tek yol, SQL sorgusunun kendisinin doğru karşılaştırmayı yapmasıdır.

C# tarafında SQLiteConnection.CreateCollation ile Türkçe’ye uygun bir karşılaştırma fonksiyonu ekleyebilirsiniz. Örneğin:
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

  • CreateCollation("TR_NOCASE", ...) ile SQLite’a yeni bir karşılaştırma kuralı ekleniyor.
  • Bu kural String.Compare + CultureInfo("tr-TR") kullanarak Türkçe harfleri doğru şekilde eşleştiriyor (İ ↔ i, I ↔ ı, Ğ ↔ ğ, Ş ↔ ş).
  • SQL tarafında COLLATE TR_NOCASE yazdığınızda artık döngüsüz ve LINQ’suz şekilde doğru DISTINCT veya GROUP BY sonucu alıyorsunuz.
Sayın üstadım yapay zekanın yazdıklarının aynısını banada yazmışyı olmadı dosyayı extra yükledim zaten açarsanız görürsünüz.Kısaca yapabildinizmi evetse bir dosyayı yükleyin.
 
Konu Sahibi
Sevgili Zafer kardeşim ;
kodu çok güzel yapılandırmışsın. Ancak distinct veya group by kullanıldığında SQLite, varsayılan olarak büyük/küçük harf farklarını dikkate alır. Bu da Ğ ,ğ, I , ı gibi sonuçlara yol açar.
collate nocase büyük/küçük harf duyarlılığını kaldırır ama Türkçeye özel karakterleri (Ğ, İ, Ş, ı, ğ) doğru işlemez
SQLite kurulu değil deneyemiyorum kodun ilgili kısmını bu şekilde revize edip dener misin.

HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
Ali ÖZ hocam yeni deneyebildim.Dictionary felan kullanmışsınız benim istediğim döngüsüz ve sorgu içinde kullanabilmek aynı sayın arzuhalci üstadın eklediği bu kod gibi SELECT distinct baslik FROM tblDeneme ORDER BY baslik COLLATE NOCASE_TURKISH;
 
Geri
Üst