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