2

私はsqliteを使用しています。仕分け以外は問題ありません。「order by」句を使用してテーブルをクエリすると、iso8859-9 文字セットに従って正しい並べ替えができません。私のエンコーディングの特殊文字は、リストの最後に表示されます。それは次のようなものです:

 - asdf
 - bnm
 - cgfj
 - dfgh
 - çdfg

しかし、私が欲しいのは:

 - asdf
 - bnm
 - cgfj
 - çdfg
 - dfgh

この問題を克服するにはどうすればよいですか?

前もって感謝します。

使用:

Windows、NetBeans、Java、SQLite

4

1 に答える 1

1

新しい照合シーケンスを定義できます。sqlite からのソートを解決したい場合は、新しい照合シーケンスの定義を参照してください。System.Data.SQLite を使用した UTF8 データの大文字と小文字を区別しない並べ替えに非常に似ています。あなたの場合、おそらく、CultureInfo.CreateSpecificCulture("tr-TR");の代わりに: を使用する必要がありますCultureInfo.CreateSpecificCulture("ru-RU");

何かのようなもの:

using System.Data.SQLite;
using System.Globalization;

namespace SQLiteUTF8CIComparison {
    /// <summary />
    /// This function adds case-insensitive sort feature to SQLite engine 
    /// To initialize, use SQLiteFunction.RegisterFunction() 
    /// before all connections are open 
    /// </summary />
    [SQLiteFunction(FuncType = FunctionType.Collation, Name = "UTF8CI")]
    public class SQLiteCaseInsensitiveCollation : SQLiteFunction {
        /// <summary />
        /// CultureInfo for comparing strings in case insensitive manner 
        /// </summary />
        private static readonly CultureInfo _cultureInfo = 
            CultureInfo.CreateSpecificCulture("tr-TR");

        /// <summary />
        /// Does case-insensitive comparison using _cultureInfo 
        /// </summary />
        /// Left string
        /// Right string
        /// <returns />The result of a comparison</returns />
        public override int Compare(string x, string y) {
            return string.Compare(x, y, _cultureInfo, CompareOptions.IgnoreCase);
        }
    }
}   

要件が許す場合の簡単な代替手段は、ソートされていないデータを sqlite から取得し、Java でソートすることです。このアプローチの使用は、大量のメモリを消費するため、膨大な数 (数百万) のレコードを選択しない場合にのみ適していることに注意してください。

于 2012-11-17T10:32:21.353 に答える