[pgsql-jp: 35547] SQLの結果での空白の扱い

shinmori toshiaki shinmori @ cbnet.co.jp
2005年 6月 22日 (水) 12:52:02 JST


新守です。

このたびPostgreSQLの7.0/7.1から8.0.3への移行を行っております。
移行自体はスムーズに済んだのですが、データの確認を行っている
と7.0/7.1とは違いSQL結果で後ろの空白が詰まった状態(rtrimを
使用したのと同じ状態)になる場合がありました。

テストに使用したテーブルとデータ
create table aaa(bbb char(10));
insert into aaa values('123   ');    -- 6桁後方空白
insert into aaa values('   456   '); -- 9桁前後ろに空白

内容確認のSQLと結果
(桁数がわかりやすいように|を前後に付けています)
select '|'||bbb||'|' from aaa;

 ?column?
----------
 |123|
 |   456|
(2 rows)

PHP5で検証しましたが、前後に'|'を連結した場合はrtrim状態
になり、項目だけ(select bbb from aaa)の場合は、空白有りの
状態で取得できました。

実行したPHP
<?
// PHP3からの移行なので古い書き方です
$con = pg_connect("host=hogehoge dbname=hogehoge");
//
$w_sql = "select '|'||bbb||'|' from aaa";
$result = pg_exec($w_sql);
if ($result == false) {
  printf("sql1(%s) false\n", $w_sql);
} else {
  printf("sql1(%s) result('%s')\n", $w_sql, pg_result($result, 0, 0));
  printf("sql1(%s) result('%s')\n", $w_sql, pg_result($result, 1, 0));
}
//
$w_sql = "select bbb from aaa";
$result = pg_exec($w_sql);
if ($result == false) {
  printf("sql2(%s) false\n", $w_sql);
} else {
  printf("sql2(%s) result('%s')\n", $w_sql, pg_result($result, 0, 0));
  printf("sql2(%s) result('%s')\n", $w_sql, pg_result($result, 1, 0));
}
pg_close($con);
?>

PHPの結果
sql1(select '|'||bbb||'|' from aaa)
result('|123|')
result('|   456|')
sql2(select bbb from aaa)
result('123       ')
result('   456    ')


7.0から8.0.2までの更新履歴などを確認しましたが該当するもの
を見つけられませんでした。postgresql.confの設定によって変わ
るのか、そもそも仕様なのか教えていただけないでしょうか?

OSはLinux、エンコードはEUC_JP、Postgreは8.0.3を使用して
おります。
同じ調査を7.4.6(dbを作成しpsqlからのみ検証)でも行いましたが
同様な現象を確認しました。

頭の中が7.1ぐらいで止まっているので愚問でしたら申し訳ありま
せんが宜しくお願いします。

+----+----+----+----+----+----+----+
(株)コンピューター・ビジネス 新守
e-mail: shinmori @ cbnet.co.jp
+----+----+----+----+----+----+----+




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