2012-04-27 89 views
6
select *from urunler where musteri like %ir%; 

測試數據:土耳其語字符SQLite中,同時使用LIKE表達

+---musteri---+---ID--+ 
+-------------+-------+ 
+---İrem------+---1---+ 
+---Kadir-----+---2---+ 
+---Demir-----+---3---+ 

返回結果:

Kadir 
Demir 

如果使用%İr%然後伊瑞姆正在返回但卡迪爾和德米爾不返回。其他土耳其人也有同樣的問題,但沒有任何確切的解決方案。我正在編程mono安卓。


[SQLiteFunction(Name = "TOUPPER", Arguments = 1, FuncType = FunctionType.Scalar)] 
    public class TOUPPER: SQLiteFunction 
    { 
     public override object Invoke(object[] args) 
     { 
      return args[0].ToString().ToUpper(); 
     } 
    }  

    [SQLiteFunction(Name = "COLLATION_CASE_INSENSITIVE", FuncType = FunctionType.Collation)] 
    class CollationCaseInsensitive : SQLiteFunction { 
     public override int Compare(string param1, string param2) { 
      return String.Compare(param1, param2, true); 
     } 
    }  

TOUPPER.RegisterFunction(typeof(TOUPPER)); 

解決了這種方式,而且單C#「使用庫,這裏是我需要做的Android.Database.Sqlite.SQLiteDatabase

+0

也許你可以使用:http://stackoverflow.com/questions/3480999/using-collat​​e-in-android-sqlite-locales-被忽略的聲明 – zapl 2012-04-27 11:40:20

回答

3

解決此類問題的一種方法是將文本的標準化版本保存到另一列中。在您使用INSERT之前,您將所有特殊字符替換爲一些常用字符,並將兩個版本都放入數據庫中。

您的表看起來像那麼

ID musteri  musteri_normalized 
--- ---------- ------------------ 
1 İrem  Irem    
2 Kadir  Kadir    
3 yapılcağ yapilcag 

現在你可以使用對歸列LIKE比較,仍然從數據庫返回真實文本。

SELECT musteri FROM table WHERE musteri_normalized LIKE '%ir%'; 
-> İrem, Kadir 
5

SQL As Understood By SQLite,節「的LIKE和GLOB運算符「:

對於超出ASCII範圍的unicode字符,LIKE運算符默認爲區分大小寫。

這意味着「我」與「我」和「我」不同。

+0

另外,如果你在比較之前使用大寫或小寫,請選擇upper - 它會導致模糊程度較低,例如Germannic「ss」 - > B – Basic 2012-04-27 11:38:54

+0

但他期望至少有Kadir和Demir ascii – waqaslam 2012-04-27 11:39:01

+0

@Waqas如果他搜索'%ir%',他會得到Kadir和Demir。但是對於SQL'İ!= i'。 unicode的不區分大小寫處理非常複雜,實際上,答案依賴於語義信息存在問題。 – Voo 2012-04-27 11:40:51

3
public class Sqlite_DB 
{ 
    private SqliteConnection CON; 
    public SqliteCommand COM; 



    string dbName = System.IO.Path.Combine(@"sdcard", @"testDB.db3"); 

    public Sqlite_DB() 
    { 
     TOUPPER.RegisterFunction(typeof(TOUPPER)); 
     CollationCaseInsensitive.RegisterFunction(typeof(CollationCaseInsensitive)); 
     CON=new SqliteConnection(String.Format("Data Source={0};Pooling={1}", dbName, false)); 
     COM=new SqliteCommand(CON); 

    } 
    public void close() 
    { 
     COM.Clone(); 
     CON.Clone(); 
    } 
    public void open() 
    { 
     CON.Open(); 
    } 

} 

#region TOUPPER 
[Mono.Data.Sqlite.SqliteFunction(Name = "TOUPPER", Arguments = 1, FuncType = FunctionType.Scalar)] 
public class TOUPPER: Mono.Data.Sqlite.SqliteFunction 
{ 
    public override object Invoke(object[] args)//characters for the growth of 
    { 
     return args[0].ToString().ToUpper(); 
    } 
}  

[Mono.Data.Sqlite.SqliteFunction(Name = "COLLATION_CASE_INSENSITIVE", FuncType = FunctionType.Collation)] 
class CollationCaseInsensitive : Mono.Data.Sqlite.SqliteFunction 
{ 
    public override int Compare(string param1, string param2) //According to Turkish character sorting to patch 
    { 
     return String.Compare(param1, param2, true); 
    } 
} 
#endregion 







public class TEST_X 
{ 
    string strValue="ir";//test 
    public void MUSTERI() 
    { 
     string srg="select * from "+Cari_._ 
       +"where TOUPPER(musteri) like '%"+strValue.toUpper()+"%';"; 

     try { 
      Sqlite_DB d=new Sqlite_DB(); 
      d.open(); 

      d.COM.CommandText=srg; 

      SqliteDataReader dr=d.COM.ExecuteReader(); 

      while (dr.Read()) 
      { 

       Android.Util.Log.Error(">>>>",dr[0].ToString()+"<<<"); 

      } 
      d.close(); 

     } catch (Exception ex) { 
      Android.Util.Log.Error(">>>>",ex+"<<<"); 
     } 

    } 
} 


ID musteri  
--- ---------- 
1 İrem     
2 Kadir     
3 Demir 

returning result: 

-İrem 

-Kadir 

-Demir 

它工作在單...

+2

謝謝謝謝X 10000 :) 如果可以的話我會給你1000票 – Igor 2013-11-07 12:59:32