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