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