[pgsql-jp: 30842] ODBC経由でTEXT型データが取得できない

Toshikazu Yoshikawa toshi @ uncut00.com
2003年 8月 26日 (火) 23:16:12 JST


お世話になります。
吉川@アンカットです。

php-usersかpgsql-jpか、どちらのMLに投げたほうがいいのか
分からなかったのですが、ODBC経由ということもあり、
こちらのMLに出させていただきます。

現在、以下の環境にて、あるウェブアプリを開発しています。

■WEBサーバ
Windows 2000 server
IIS 5.0
マルチバイト対応版PHP-4.3.1
psqlODBC 07.03.0100

■DBサーバ
Slackware 9.0.0
PostgreSQL 7.3.2

Win2kサーバ上のPHPスクリプトから、ODBC経由でPostgreSQLに
アクセスしています。
(libpq.dllを使わないのは、顧客からの要求仕様です・・・)

順調にPHPからDBに接続でき、開発も進んでいたのですが、
あるSQL文だけ結果が返ってこないという現象に当たりました。
どうやら、TEXT型フィールドのみをselectしようとすると
結果が得られないようです。

以下に実験した内容を示します。

まず、DBサーバ内にinteger型のプライマリーキーと
text型のフィールドのみを持つt1というテーブルを作成します。

test=> \d t1
       Table "public.t1"
  Column  |  Type   | Modifiers
----------+---------+-----------
 pkey     | integer | not null
 text_val | text    |
Indexes: t1_pkey primary key btree (pkey)

このテーブルに、1行だけテストデータを入れました。

test=> SELECT * from t1;
 pkey |     text_val
------+-------------------
    1 | test text value 1
(1 row)

そして、Win2kから以下のPHPスクリプトにてアクセスします。

--- test.php ---
<?php

$conn = odbc_connect ("test", "testuser", "", SQL_CUR_USE_ODBC);

$result = odbc_exec ($conn, "select * from t1");

while (odbc_fetch_row ($result))
	for ($i = 1;$i <= odbc_num_fields ($result);$i++)
		printf ("%s = %s<BR>\n",
					odbc_field_name ($result, $i),
					odbc_result ($result, $i));

?>

ブラウザから、上記test.phpにアクセスすると、

pkey = 1
text_val = test text value 1

のように正常な結果が表示されます。

ところが、select文を以下のものに変更すると結果が返ってきません。
select text_val from t1

text_val = test text value 1
と表示されることが期待されるのですが、
odbc_fetch_row()の戻り値はNULLになり、何も表示されません。

試しに、
select pkey from t1 や select pkey, text_val from t1 とすると
正常に動作します。
どうやら、text型のフィールドのみをselectさせたときにおかしくなるようです。

ODBCドライバの設定で、「textを長文字列として扱う」という
項目のチェックを外すと、text型フィールドのみの抽出も可能になることは
確認したのですが、それを行うとvarchar型として扱われるため、
今度は254文字以上の文字列を扱うことができません。

これはドライバによる仕様なのか、
私の使用法が間違っているのか判断できず困っております。
とりあえず現在はSQL文で対応するようにしていますが、
根本的な解決ではないため、識者の方のご意見を伺えたらと思います。

長文になってしまいましたが、よろしくお願いいたします。
既出でしたらすみません。

-- 
Toshikazu Yoshikawa <toshi @ uncut00.com>




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