[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 メーリングリストの案内