- PR -

PostgreSQL 日本語データのグループ化

1
投稿者投稿内容
もく
会議室デビュー日: 2005/07/03
投稿数: 4
投稿日時: 2005-07-03 11:55
PostgreSQL+PHPで、
"select A from T group by A;"
で、Aに日本語データが入っていた場合に、
文字数でグループ化されてしまいます。
(PostgreSQL7.3.2-3 PHP4.2.2)

環境によってはうまく動きますので、
PostgreSQLのバージョンや設定の違いかと思うのですが、
何か解決のヒントがあればお教えいただけないでしょうか?
よろしくお願いいたします。
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2005-07-03 19:27
引用:

もくさんの書き込み (2005-07-03 11:55) より:
PostgreSQL+PHPで、
"select A from T group by A;"
で、Aに日本語データが入っていた場合に、
文字数でグループ化されてしまいます。
(PostgreSQL7.3.2-3 PHP4.2.2)


具体的にどのような結果がでるのか教えてもらえませんか?
出たままをそのままペーストしてもらえるのがベストですが、
差し障りがあるようならば適当な文字に置き換えてもらっても
かまいません。

どのようなデータが入っていて。
どのような操作をおこなって。
どのような結果がでた。(若しくはでなかった)
そして、期待していたのはこのような結果である。

が、わからないと解決までに余計なやり取り、時間がかかるかと
おもいます。

引用:

環境によってはうまく動きますので、


うまくいくと言う環境をおしえてもらえませんか?
もく
会議室デビュー日: 2005/07/03
投稿数: 4
投稿日時: 2005-07-04 13:24
返信ありがとうございます。

"select A from T;"の結果、

"あいう"
"aaa"
"あ"
"かきくけ"
"さささ"
"bbb"
"あいう"

と表示されたとします。
この状態で
"select A from T group by A;" とすると、

(PostgreSQL7.4 PHP4.3.11)の環境においては、
"あいう"
"aaa"
"あ"
"かきくけ"
"さささ"
"bbb"
というように、"あいう"が正常にグループ化されているのですが、

(PostgreSQL7.3.2-3 PHP4.2.2)の環境においては、
"あいう"
"aaa"
"あ"
"かきくけ"
"bbb"
と表示されます。

count(*)で件数を見てみますと、
"あいう"が3件となりますので、
日本語データだけがその文字数で
グループ化されているのではないかと思われます。

おかしな現象で、困惑しております。
何か単純なミスかとも思うのですが・・・
どうかご教授よろしくお願いいたします。

せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2005-07-05 04:26
確認です。上記結果は、PHP上に表示しておこなってますか?
それとも、Postgres に pg_ctl 等で接続して確認していますか?

もしも後者ならば、Postgres に対して SQLを実行し、同じ結果に
なるのかどうか、問題点がどこにあるのか、(PHP なのか、Postgres なのか)
を切り分けた方がいいとおもいます。


もしも前者であり、構築の期限があるようでしたら、正常に動作する
環境へ切り替える判断をされた方が宜しいかと。
もちろん、環境をかえるリスクはきちんと計った上で、であることは
言うまでもない事ですが。
もく
会議室デビュー日: 2005/07/03
投稿数: 4
投稿日時: 2005-07-05 09:26
おはようございます。

telnet等使えない環境ですので、
(PostgreSQL7.4 PHP4.3.11)も
(PostgreSQL7.3.2-3 PHP4.2.2)においても
同じPHPで検証しています。

PHPに関しましては、

$sql = "select A from T;";
$rs = pg_exec ($con,$sql);
$num = pg_numrows($rs);
for($count=0;$count<$num;$count++){
$array = pg_fetch_array($rs,$count);
print_r($array);
echo "<br><br>";
}

$sql = "select A from T group by A;";
$rs = pg_exec ($con,$sql);
$num = pg_numrows($rs);
for($count=0;$count<$num;$count++){
$array = pg_fetch_array($rs,$count);
print_r($array);
echo "<br><br>";
}

といった単純なもので確認しておりますので、
PHPのバージョンの違いとは考えにくいかと思います。

残念ながら環境を変更することは
できませんので、
なんとか、日本語データでのグループ化をコードで
行えるよう仕様変更の方向で検討します。

また何かヒントがございましたら、
よろしくお願いいたします。ありがとうございました。
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2005-07-05 16:06
PostgreSQLでこういう日本語の比較やソートの問題が起きる場合は、
大抵initdb時に --no-locale オプションを付け忘れていることが原因です。
以下のページなどを参考に設定を確認してみてください。
http://ml.postgresql.jp/pipermail/pgsql-jp/2004-July/017119.html
もく
会議室デビュー日: 2005/07/03
投稿数: 4
投稿日時: 2005-07-07 16:32
貴重なアドバイスありがとうございます。
さっそくロケール関連で調べましたところ、
同様の現象がWEB上でも議論されておりました。

レンタルサーバーのため、
自分では設定できませんので、
業者のほうに問い合わせてみます。
大変助かりました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)