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

0 ответов

Другие вопросы по тегам