[pgsql-jp: 38207] Re: ロケールCでインストールしないとLIKEで invalid memory alloc request

ITAGAKI Takahiro itagaki.takahiro @ oss.ntt.co.jp
2007年 3月 22日 (木) 11:26:11 JST


Tatsuo Ishii <ishii @ sraoss.co.jp> wrote:

> > 確証があるわけではないのですが、PostgreSQL のロケールの使い方自体にも
> > 何か問題が無いか、多少 疑っています。
> > 「--no-locale なら大丈夫」は、思考停止している印象を受けます。
> 
> 「ロケールの使いかた自体にも問題があ
> る」というのは,ロケールを有効にしたときの話ですよね?
> 
> それに対して,
> 
> > 「--no-locale なら大丈夫」は、思考停止している印象を受けます。
> 
> はロケールを無効にしたときの話です.私には2つの文章がつながらないので
> すが,もう少し板垣さんの主張を噛み砕いて説明していただけませんか?

「思考停止」とは、
「PostgreSQL のロケールの使い方には、問題があるかもしれない。
  しかし、--no-locale ならば動作するので、『修正する必要は無い』」
という考え方についてでした。
全ての責任を壊れたロケールに押し付けず、PostgreSQL 側での対応が
適切かどうかも、きちんと見ていく必要があると考えています。


例えば、PostgreSQL ソースコード中の、以下の strcoll() の使い方は間違っています。
データベースサーバのエンコーディングと、
Cランタイムライブラリが処理可能なエンコーディングを混同しています。

varlena.c
varstr_cmp(char *arg1, int len1, char *arg2, int len2)
{
    if (lc_collate_is_c())
        ...
    else
    {
★      result = strcoll(a1p, a2p);


元々の質問は、日本語版 Windows でしょうから、
strcoll() に渡す文字列のエンコーディングは、SJIS でなければなりません。
ところが、PostgreSQL ではサーバ・エンコーディングに SJIS は許されていませんので、
EUC-jp なり、他のエンコーディングが渡されているはずです。
これでは、決して正しく動作しません。

これは、片岡さんの書かれている、
| もしもWindowsの提供するロケールを信頼していたとしても、それに一致す
| る日本語向けのエンコーディングをPostgreSQLは持っていないので…以下略:-)
の部分なのでしょうね。

# UTF8 専用の処理があるようなので、もしかすると、サーバ・エンコーディング UTF8
# かつ locale=Japanese ならば、正しく動作するのかも……?




pgsql-jp メーリングリストの案内