2021/05/07

PHP7以前 クエリ結果のカラム文字列を取得できない場合(2GB文字列問題)

データベースのカラムからデータを取得し、phpで扱う作業を行った際、
文字列を取得してこなくて、酷く嵌ったので、オボエガキ。

PHP7とPHP5で平行稼働させている類似のプログラムがあり、
先にPHP7を修正し、追加のカラムの文字列を取得させると、意図する通りに動作した。

続いてPHP5を動かすが、 取得してこない。

 

色々調べたところ、PHP(7以前)の文字列型は2GB以上の文字列を処理できない
正確には、nverchar等でカラムサイズが2147483647(int4の最大値)
で定義されている場合、PHP内でうまく扱えず、空白として処理されてしまうようだ。

PHPのzvalue_value共用体で文字列長をint型で管理しているため、
文字列の長さが2147483647を超えるとマイナスになってしまうことが原因らしい

PHP5のまま稼働させる必要があったので、クエリにてレコードを取得する際に、

select CONVERT(VARCHAR(512), <カラム名>) as hoge from <table名> where ~;

 

のように、varcharのサイズを指定してカラムを取得すれば,以降PHP内でカラムの文字列を扱えた。

3時間くらい同僚と嵌ってしまい、困ったので、忘れないように残しておく。



0 件のコメント:

コメントを投稿