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') ) );