у меня есть varbinary(8000)
поле базы данных в SQL Server, которое я хочу вытащить. Ограничение sqlsrv для данных varbinary составляет 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 по какой-то причине удваивает значение, когда проверяет максимально допустимый размер поля.
Я также могу использовать 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 байт?
Изменить: это техническая документация означает, что если вы хотите передать изображения размером более 8 КБ, вам следует использовать varbinary(max)
В этом разделе мы рассмотрим код в примере приложения, который отправляет изображение на сервер в виде двоичного потока. Следующий код открывает изображение в виде потока, а затем отправляет файл на сервер по частям до 8 КБ за раз:
$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') ) );
Задача ещё не решена.
Других решений пока нет …