当我从 SQL 服务器数据库中提取二进制文件时,为什么我的所有图像都被截断了?

Why are all of my images getting cut off when I pull the binary out of a SQL Server DB?

我在 Amazon Linux AMI 上的 PHP 7 中使用 PDO 连接到 Amazon RDS 上的 SQL 服务器数据库 运行。

到目前为止,除了一列中的一列 table 之外,我已经能够很好地从数据库中提取所有数据。该列的类型为 image,包含二进制数据。

当我尝试在 PHP 中使用 PDO 到 select 从有问题的列,然后将二进制文件输出到浏览器 window 并发送必要的 header (例如,header('Content-Type: image/jpeg');),我只能看到文件的一部分(在图像的情况下)或出现 corrupt-file 错误(在 PDF 的情况下)。

在少数情况下(我假设文件非常小),我可以看到完整的图像,但这种情况很少见。

以下是 Chrome 中此问题的示例:

我在这个问题上做了一些相当广泛的谷歌搜索,但似乎没有很多关于这个问题的信息,而且我看到的所有页面都很旧并且与任何一个相关mssql(在 PHP 7 中不再可用)或 sqlsrv 驱动程序。

以下是我发现的(看似)相关页面的一些示例:

有没有人知道为什么会发生这种情况以及我该如何解决?我觉得 PDO 应该可以处理这个问题,但是如果 PDO 有问题,我需要使用一些其他驱动程序来处理这个问题,那也没关系。

谢谢。

我终于找到了答案。通过 PDO 返回到 PHP 的数据实际上在 64k 处被截断,从而导致问题。

Alex 建议将 TEXTSIZE 设置为 -1,帮助我走上了正确的道路。我犯的菜鸟错误是我从 Microsoft SSMS 中做了 SET TEXTSIZE -1,假设它将为所有连接全局设置,但事实并非如此。它只为 SSMS 连接设置它,因此出现问题。

但是,当我最终在PHP中的PDO中进行了以下操作时,即使用PDO连接将TEXTSIZE设置为-1,然后从PDO进行查询时,我能够为 PDO 连接设置 TEXTSIZE,然后取回所有数据:

doSqlServerQuery("SET TEXTSIZE -1;");

$results = doSqlServerQuery("SELECT binary-data-image-column AS data 
  FROM table-name 
  WHERE key = 95948578934578934;");

//Function definition

function doSqlServerQuery($query, $dbh = null) {
  if (!isset($dbh)) {
    global $dbh;
  }

  $stmt = $dbh->prepare($query);

  if ($stmt) {
    $stmt->execute();

    $results = [];
    while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
      $results[] = $result;
    }

    return $results;
  } else {
    pO($dbh->errorInfo());
  }
}

我自己解决了这个问题,它在上传 64KB 后被切断,要解决这个问题,要么将限制设置为 64KB,要么将其更改为 longblob,这将为您提供 4 GB 的存储空间而不是 64 KB。