libSqliteIcuは、sqlite3 ターミナルで次のように正常に動作します。
sqlite3
...
.load './libSqliteIcu.so'
SELECT icu_load_collation('pl_PL', 'POLISH');
SELECT DISTINCT miasto FROM tab ORDER BY miasto COLLATE POLISH;
上記のシーケンスをperlにコーディングするには?
未テスト:
use DBI qw();
my $dbh = DBI->connect('DBI:SQLite:thedatabase.sqlite');
$dbh->sqlite_enable_load_extension(1);
$dbh->do(q{SELECT load_extension('./libSqliteIcu.so')});
$dbh->do(q{SELECT icu_load_collation('pl_PL', 'POLISH')};
my $miasto = $dbh->selectall_arrayref(q{SELECT DISTINCT miasto FROM tab ORDER BY miasto COLLATE POLISH});
または、Perl で並べ替えます。
use utf8;
my @tongue_twister = qw(Król Karol kupił królowej Karolinie korale koloru koralowego);
use Unicode::ICU::Collator qw(); # ICU C library, fast
my $c = Unicode::ICU::Collator->new('pl_PL');
use Unicode::Collate qw(); # pure-perl, slow
my $c = Unicode::Collate->new(locale => 'pl_PL');
my @sorted = $c->sort(@tongue_twister);
# (
# 'Karol',
# 'Karolinie',
# 'koloru',
# 'korale',
# 'koralowego',
# 'Król',
# 'królowej',
# 'kupił'
# )
単純ですが完璧ではないpl_PL.UTF8
解決策の1つは、ロケールを使用することです。
sqlite3では以下を準備します:
create table A(idA);
...
insert into A values('ź');
insert into A values('Ż');
insert into A values('ź');
insert into A values('Š');
...
insert into A values('ś');
...
そして今:
select * from A;
与える:ZźŻźzśżSŠz。
だから私たちはロードします:
.load './libSqliteIcu.so'
SELECT icu_load_collation('pl_PL', 'POLISH');
select idA from A order by idA collate POLISH;
そして私達は持っています:SŠśzzZźźżŻ。
だから今perlに置くことができます:
SELECT idA FROM A ORDER BY idA
正しい順序ではありません: SZzzśŠźźŻż
さて、perllocaleでperlを入れました:
SELECT idA FROM A ORDER BY idA COLLATE perllocale
注文を取得します:SŠśzzZźźżŻ。
私の$dbh->do(q{SELECT load_extension('./libSqliteIcu.so')});
場合は機能しません。エラーが発生します:
DBD :: SQLite :: db do failed:初期化中にアクティブステートメントエラーが発生したため、ユーザー機能を削除/変更できません