デフォルトでは、Sqlite3はASCII文字でのみソートされます。グーグルで調べてみましたが、見つけたのは照合情報だけでした。Sqlite3にはNOCASE
、RTRIM
とのBIARY
照合のみがあります。特定のロケールのサポートを追加するにはどうすればよいですか?(私はRailsアプリケーションで使用しています)
4 に答える
Doug Currieの回答を受け入れましたが、sqlite3のドキュメントは(少なくとも私にとっては)非常に奇妙であるため、「アルゴリズム」を追加する方法を追加したいと思います。
わかりました、sqlite3 が動作し、現在:
それをコンパイルします。
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
コンパイル オプションに追加することを提案しましたが、それは役に立ちました。sqlite3 を実行します。次のコマンドで拡張機能をロードできます。
.load './libSqliteIcu.so'
現在のディレクトリにあると仮定すると、パス全体を指定することもできます。
新しい照合を作成:
SELECT icu_load_collation('pl_PL', 'POLISH');
最初のパラメーターは目的のロケールで、2 番目のパラメーターはそのロケールです (何でもかまいません)。
これで、新しいロケールでデータを並べ替えることができます:
SELECT * FROM some_table ORDER BY name COLLATE POLISH;
大文字と小文字を区別しません。
SQLiteはICUとの統合をサポートしています。Readme ファイルによると、
このディレクトリには SQLite の "ICU" 拡張 ("International Components for Unicode" ライブラリと SQLite の統合) のソース コードが含まれています。sqlite/ext/icu/README.txt
sqlite/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
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');
このアプローチがネイティブ拡張ほど効率的であるとは思いませんが、確実に移植性が高くなります。