PHP sqlsrv библиотека обрабатывает ограничения varbinary данных

у меня есть 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 по какой-то причине удваивает значение, когда проверяет максимально допустимый размер поля.

Максимальное решение — будет ли это полностью возвращать 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 байт?


Изменить: это техническая документация означает, что если вы хотите передать изображения размером более 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')
)
);

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]