[pgsql-jp: 38200] Re: ロケールCでインストールしないとLIKEで invalid memory alloc request
ITAGAKI Takahiro
itagaki.takahiro @ oss.ntt.co.jp
2007年 3月 22日 (木) 10:00:04 JST
板垣です。
Tatsuo Ishii <ishii @ sraoss.co.jp> wrote:
> 私はどうしてもOSのロケールデータが信頼できないので,Cロケールを使うこ
> とにしています.腐ったロケールデータを使うとインデックスも腐ってしまう
> ので,検索洩れやら何やら起こってしまう可能性があり,かなり致命的な結果
> になってしまいます.
検索漏れに関しては、ロケールの有効/無効それぞれで、
うまく働かないケースはありえます。
例えば、「が」と「か゛」(か+濁点)は、
ロケール=Japanese では同一視されますが、C ではされません。
これを「検索漏れ」と見なすかどうかは、使う人次第でしょう。
少なくとも、現状の PostgreSQL は、ロケールをまともに扱えません。
ロケールを考慮した文字列比較は、諦めるしかありません。
残念ながら「ロケールCが、必須です」。単純な文字単位の比較しかできません。
もしかすると、日本語以外の場合は、うっかり動いてしまうのかもしれません。
そのため、現状で十分と誤解されており、待っていても改善されないのでしょう。
日本語(もしくは、他の問題があるエンコーディング)を使う人間にしか、
修正するモチベーションは生まれないのは、仕方ないところかと思います。
static void cmp(const char* lhs, const char* rhs)
{
printf("(%s = %s) => %d\n", lhs, rhs, _stricoll(lhs, rhs));
}
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "C");
cmp("が", "か゛");
setlocale(LC_ALL, "Japanese");
cmp("が", "か゛");
return 0;
}
[結果]
(が = か゛) => 1
(が = か゛) => 0
pgsql-jp メーリングリストの案内