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