【问题标题】:Failed to read blob data from sqlite从 sqlite 读取 blob 数据失败
【发布时间】:2011-04-14 10:16:24
【问题描述】:

我像这样用 php 存储 blob 数据

$this->_db->exec"CREATE TABLE media (url TEXT, content BLOB)");

$fp = fopen($encoded['path'], 'rb');
$sql = "INSERT INTO media (url, content) VALUES (?, ?)";
$stmt = $this->_db->prepare($sql);
$stmt->bindValue(1, $encoded['url'], PDO::PARAM_STR);
$stmt->bindValue(2, $fp, PDO::PARAM_LOB);
$stmt->execute();
fclose($fp);

在我的 c++ 程序(使用 bada 框架)中,我从 blob 列中读取数据。问题是,当我在本地主机(版本 5.3.2-1ubuntu4.2)上使用 php 时,我的 c++ 应用程序可以正确地将 blob 列识别为 blob 类型。但是当我使用远程主机(php 版本 5.2.12)创建 sqlite 文件时,我的 c++ 应用程序将 blob 列识别为 TEXT TYPE,并且我的二进制数据已损坏。

有人知道原因和解决方法吗?

谢谢

【问题讨论】:

  • 鉴于您混合使用了 PHP 5.2 和 5.3,这很可能是由于 sqlite 库的不同。可能是在推出 Ubuntu 安装时修复的错误。
  • 我也这么认为。但问题是,我无法在共享主机上升级 sqlite。希望老版本有解决办法。

标签: php sqlite binary blob bada


【解决方案1】:

确保您正在阅读和编写相同的 SQLite 版本,而不是: Server = SQLite2 C++ = SQLite2 或 Server = SQLite3 C++ = SQLite3,因为那样会失败。

如果这是问题所在(这很可能是由于 SQLite 中的更改导致两个版本不兼容,反之亦然),您有两种选择:

  1. 您可以更新您的服务器(询问您的提供商),或者
  2. 您可以使用适用的 C++ 源代码使您的软件能够读取您的服务器可以处理的内容。为此,您可以在 sqlite.org 上获取 SQLite2 的源代码(以及在此处存档的所有其他构建)。更准确地说,您可以在http://www.sqlite.org/cgi/src/info/47fee16ba9 找到最新版本 SQLite2 源代码的最新下载,以便将支持编译到您的 c++ 程序中。

希望能震撼你的船。 ;)

PS:如果这不是问题并且您正在读取/写入相同的 SQLite 版本,您可以尝试对您尝试存储的二进制数据进行十六进制编码并将其保存到 TEXT 而不是 BLOB。这是一种解决方法,但确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多