coolwolf / 08/06/2012

sqlite türkçe harf sıralaması, sqlite turkish collation

Kullandığım projelerde ACCESS yerine SQLite kullanmayı uzun zamandır düşünüyordum. Fakat SQLite altında sorgu yaptığımda harfleri Türkçe sıralayamıyordu.
Bu sorunu çözmek için önce SQLite ve ICU bileşenlerini kendim derlemeyi denedim. Fakat C bilgim olmadığı için bu konuda başarılı olamadım.
Ardından yılmadım ve denemelerime devam ettim.
En sonunda bu adresteki kodu kullanarak sorunumu çözebildim.
Namespace’imizin içinde bir yere şu satırları ekliyoruz:

[SQLiteFunction(FuncType = FunctionType.Collation, Name = "UTF8CI")]
    public class SQLiteCaseInsensitiveCollation : SQLiteFunction
    {
        private static readonly System.Globalization.CultureInfo _cultureInfo = System.Globalization.CultureInfo.CreateSpecificCulture("tr-TR");
        public override int Compare(string x, string y)
        {
            return string.Compare(x, y, _cultureInfo, System.Globalization.CompareOptions.IgnoreCase);
        }
    }

Şimdi bu fonksiyonu kullanabilmemiz için Program.cs dosyamızdaki Main() fonksiyonunun içine şu satırı ekliyoruz:

System.Data.SQLite.SQLiteFunction.RegisterFunction(typeof(SQLiteCaseInsensitiveCollation));

Eğer tabloları herhangi bir SQLite Yönetim programıyla oluşturduysanız Türkçe sıralama yine çalışmayacaktır.
İsterseniz buradaki derme çatma programı kullanarak da SQLite veritabanınızı yönetebilirsiniz.
Tabloları kendimiz program içinde oluşturmalıyız. SQL konusunda iyi değilseniz SQLite yönetim programlarını herhangi biriyle oluşturduğunuz tabloyu EXPORT ederek SQL kodlarını elde edebilirsiniz.
Burada sıralama yapacağınız (ORDER BY) FIELD’ların oluşturma koduna COLLATE UTF8CI kelimelerini ekliyoruz:

CREATE TABLE `tablom` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`adi` TEXT NULL COLLATE UTF8CI,
`soyadi` TEXT)

Bundan sonra yapacağınız insert ve select sorgularında sıralama Türkçe oalcaktır.
Eğer

No such collation: UTF8CI

şeklinde hata alırsanız select sorgusunun sonuna COLLATE BINARY kelimelerini ekleyin :

select * from tablom order by adi COLLATE BINARY

İyi kodlamalar.