1

varbinary(8000)SQL Server に引き出したいデータベース フィールドがあります。varbinary データの sqlsrv 制限は 8000 です。

ただし、データを選択すると

<?php
$query = "
    SELECT myvarbinary
    FROM   table
    WHERE  id = 48033;
";
$results = sqlsrv_query($this->conn, $query);
return sqlsrv_fetch_array($results, SQLSRV_FETCH_NUMERIC);

次に、sqlsrv_fetch_arrayエラーが発生します。

PHP Fatal error: Invalid sql_display_size

切り捨てソリューション (機能しますが、役に立ちません)

フィールドを変換するvarbinary(4000)と機能しますが、varbinary(4001)失敗します:

<?php
$query = "
    SELECT CAST(myvarbinary AS varbinary(4000)) AS myvarbinary
    FROM   table
    WHERE  id = 48033;
";
$results = sqlsrv_query($this->conn, $query);
return sqlsrv_fetch_array($results, SQLSRV_FETCH_NUMERIC);

ただし、これは役に立ちません。データの半分を切り捨てています。

これは、制限が 8000 であると想定されているにもかかわらず、何らかの理由で sqlsrv ライブラリが最大許容フィールド サイズをチェックするときに値を 2 倍にしていることも意味します。

MAX ソリューション - これは 8000 バイトを完全に返すのでしょうか、それとも黙って切り捨てるだけですか?

どちらが機能するかを使用することもできますvarbinary(max)

<?php
$query = "
    SELECT CAST(myvarbinary AS varbinary(max)) AS myvarbinary
    FROM   table
    WHERE  id = 48033;
";
$results = sqlsrv_query($this->conn, $query);
return sqlsrv_fetch_array($results, SQLSRV_FETCH_NUMERIC);

sqlsrv から返されるデータのテストでは、データが切り捨てられているかどうかを証明できません。したがって、このソリューションは機能すると思いますが、確信は持てません。

sqlsrv が私のデータを 4000 バイトに切り詰めていないことを、もう少し信じてくれる人はいますか?


編集:このテクネットのドキュメントは、8KBを超える画像を転送する場合は、使用する必要があることを示していますvarbinary(max)

このセクションでは、画像をバイナリ ストリームとしてサーバーに送信するサンプル アプリケーションのコードを調べます。次のコードは、画像をストリームとして開き、一度に最大 8KB まで分割してファイルをサーバーに送信します。

$tsql = "INSERT INTO Production.ProductPhoto (LargePhoto)
       VALUES (?);
       SELECT SCOPE_IDENTITY() AS PhotoID";
$fileStream = fopen($_FILES['file']['tmp_name'], "r");
$params = array(
   array(
       $fileStream,
       SQLSRV_PARAM_IN,
       SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY),
       SQLSRV_SQLTYPE_VARBINARY('max')
   )
);
4

0 に答える 0