[PHP-users 29584] Microsoft Access(*.mdb) からの読出しにおける文字数制限について

TAKA.Q kaga.takashi @ home.nifty.jp
2006年 7月 3日 (月) 18:33:57 JST


MSAccess から Unified ODBC を使って全角15文字以上のフィールドを
読み出そうとすると、16文字以降が正常に読み出せない事があります。
(OK/NGの条件は今のところ不明です)
内部的なサイズ(32Byte?)に引っかかっているようなのですが…

【環境】
Windows XP sp2
PHP 4.4.1(Windows binary)
MS Access2000 SR1
ODBC Driver ver.4.00.6304.00
ANHTTPD 1.42n

【実行例】
MS Access で db1.mdb に table1 を作り、id, text にそれぞれ、
1, 123456789★123456789★...789★(全角50文字)
を登録した状態で、

$con = odbc_connect("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=db1.mdb", "
", "");
$sql = "SELECT * FROM table1";
$result = odbc_exec($con, $sql);

の後に、

1.odbc_result_all() で表示
→15文字までしか表示されない。

2.odbc_fetch_array() で取得
→15文字までは正常、16文字以降も表示されるが化ける
・strlen() では99または100、mb_strlen() では 73〜75 くらいで変化する

3.odbc_result() で取得
→15文字までは正常、16文字以降も表示されるが化ける
・strlen() では99または100、mb_strlen() では 73〜75 くらいで変化する

・2と3を同一スクリプトで取得した場合にそれぞれの mb_strlen() の
値が一致しない事がある

同じ取得方法でも strlen(), mb_strlen()の値が変化するのは
スクリプトを書き換えた場合(コメントの挿入等)で、
時には先の SQL 文が後ろにそのまま表示される場合があります。
(スクリプト本体部分の記憶領域を壊しているような感じです)

odbc_result_all() の出力から、なんらかの制限があるように
思えるのですが、実際のところどうなのでしょう?

できれば解決したいと思いますので、ご存知の方がいらっしゃいましたら、
よろしくお願いします。


(以下、ご参考)
【phpinfo(抜粋)】
[odbc]
ODBC Support: enabled
Active Persistent Links: 0
Active Links: 0
ODBC library: Win32

Directive: Local Value, Master Value
odbc.allow_persistent: On, On
odbc.check_persistent: On, On
odbc.default_db: no value, no value
odbc.default_pw: no value, no value
odbc.default_user: no value, no value
odbc.defaultbinmode: return as is, return as is
odbc.defaultlrl: return up to 4096 bytes, return up to 4096 bytes
odbc.max_links: Unlimited, Unlimited
odbc.max_persistent: Unlimited, Unlimited

【multi-byte 関係】
dl('extensions/php_mbstring.dll');
mb_language("ja");
mb_internal_encoding("SJIS");


# 古い住所録を PostgreSQL に移したいのですが、
# 建物名の入った長い住所がことごとく引っかかります。



PHP-users メーリングリストの案内