1

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 库在检查最大允许字段大小时出于某种原因将值加倍。

MAX 解决方案 - 这将完全返回 8000 字节还是只是默默地截断它?

我也可以使用varbinary(max)which works。

<?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 字节?


编辑:此technet 文档表明,如果要传输大于 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')
   )
);
4

0 回答 0