15

デフォルトでは、Sqlite3はASCII文字でのみソートされます。グーグルで調べてみましたが、見つけたのは照合情報だけでした。Sqlite3にはNOCASERTRIMとのBIARY照合のみがあります。特定のロケールのサポートを追加するにはどうすればよいですか?(私はRailsアプリケーションで使用しています)

4

4 に答える 4

27

Doug Currieの回答を受け入れましたが、sqlite3のドキュメントは(少なくとも私にとっては)非常に奇妙であるため、「アルゴリズム」を追加する方法を追加したいと思います。

わかりました、sqlite3 が動作し、現在:

  1. sqlite の ICU 拡張機能をダウンロード

  2. それをコンパイルします。

    gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so
    

    Linux用です。追加の ICU 開発パッケージもインストールする必要がありました。

    sudo apt-get install libicu-dev
    

    私は64ビットアーキテクチャに取り組んでおり、エラーが発生します__relocation R_X86_64_32S__(意味が何であれ:)。GCC は-fPICコンパイル オプションに追加することを提案しましたが、それは役に立ちました。

  3. sqlite3 を実行します。次のコマンドで拡張機能をロードできます。

    .load './libSqliteIcu.so'
    

    現在のディレクトリにあると仮定すると、パス全体を指定することもできます。

  4. 新しい照合を作成:

    SELECT icu_load_collat​​ion('pl_PL', 'POLISH');
    

    最初のパラメーターは目的のロケールで、2 番目のパラメーターはそのロケールです (何でもかまいません)。

  5. これで、新しいロケールでデータを並べ替えることができます:

    SELECT * FROM some_table ORDER BY name COLLATE POLISH;
    

    大文字と小文字を区別しません。

于 2009-03-05T15:32:42.780 に答える
13

SQLiteはICUとの統合をサポートしています。Readme ファイルによると、 このディレクトリには SQLite の "ICU" 拡張 ("International Components for Unicode" ライブラリと SQLite の統合) のソース コードが含まれています。sqlite/ext/icu/README.txtsqlite/ext/icu/

1. Features

    1.1  SQL Scalars upper() and lower()
    1.2  Unicode Aware LIKE Operator
    1.3  ICU Collation Sequences
    1.4  SQL REGEXP Operator
于 2009-03-05T12:41:40.493 に答える
2

ICU 拡張機能をコンパイルする余裕がない場合は、UDF に同じことをさせることができます。PHP/PDO の場合:

$pdo->sqliteCreateFunction('locale',
    function ($data, $locale = 'root')
    {
        static $collators = array();

        if (isset($collators[$locale]) !== true)
        {
            $collators[$locale] = new \Collator($locale);
        }

        return $collators[$locale]->getSortKey($data);
    }
);

使用例:

SELECT * FROM "table" ORDER BY locale("column", 'pt_PT');

このアプローチがネイティブ拡張ほど効率的であるとは思いませんが、確実に移植性が高くなります。

于 2013-09-01T23:59:24.327 に答える