7
select *from urunler where musteri like %ir%;

テストデータ:

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

返される結果:

Kadir
Demir 

使用する%İr%と、イレムは戻ってきますが、カディールとデミールは戻ってきません。他のトルコ語の文字にも同じ問題がありますが、正確な解決策はありません。私はモノアンドロイドをプログラミングしています。


    [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));

この方法で解決しましたが、mono c# 'ライブラリを使用して、ここで Android.Database.Sqlite.SQLiteDatabase を実行する必要があります

4

4 に答える 4

4

SQLiteが理解しているSQLから、「LIKEおよびGLOB演算子」のセクション:

LIKE演算子は、ASCII範囲を超えるUnicode文字に対して、デフォルトで大文字と小文字を区別します。

これは、「İ」が「i」や「I」とは異なることを意味します。

于 2012-04-27T11:36:43.503 に答える
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

それはモノラルで動作します...

于 2012-04-28T08:29:36.713 に答える
3

このような問題の解決策の 1 つは、テキストの正規化されたバージョンを別の列に保存することです。テキストを作成する前に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
于 2012-04-27T12:21:50.443 に答える
0

これは最善の解決策ではありません。しかし、私はこの問題を解決するための回避策を作成しました。

ここで見つけることができます:http://codelama.com/sqlite-turkce-harf-siralamasi-sqlite-turkish-collat​​ion /

このソリューションには UTF8CI 名前付き照合が必要なため、SQLite Admin も少し作成します。こちらのgithubにもあります

ソースからのコンパイルなど、icuを使用しようとしました。これが私にとって最も簡単な解決策でした。お役に立てば幸いです。

動作させる手順: 1. 名前空間の任意の場所に次のコードを追加します。 [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); } }

  1. program.cs で、最初のフォームを開く直前に次のコードを挿入します。 System.Data.SQLite.SQLiteFunction.RegisterFunction(typeof(SQLiteCaseInsensitiveCollation));

これで、トルコ語の照合ができます。これを機能させるには、テキスト列定義の後に「COLLATE UTF8CI」を追加する必要があります。このような: CREATE TABLE maytable ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, mytextfield1 TEXT NULL COLLATE UTF8CI, mytextfield2 TEXT)

「No such collat​​ion: UTF8CI」が表示された場合は、クエリの末尾に「COLLATE BINARY」を追加します。このような: select * from mytable order by mytextfield COLLATE BINARY

于 2019-03-27T13:20:13.033 に答える