【问题标题】:copying a blob from mysql to postgres not going well (i don't see the image anymore)将 blob 从 mysql 复制到 postgres 不顺利(我不再看到图像)
【发布时间】:2013-06-26 15:46:30
【问题描述】:

我必须将 blob 图像 (jpeg) 从 mysql 数据库复制到带有字段 bytea 的 postgres 表。 我使用 c++ ..我以这种方式从 mysql 读取图像

char* buffer = new char[res2->getInt(1)];
memset(buffer, '\0', res2->getInt(1));
(res->getBlob("att"))->read(buffer,res2->getInt(1));

res2 包含 LENGHT(blob_field)。 现在,如果我将缓冲区保存在文件上,我会完美地看到图像。 之后我用

在 postgres 表上写缓冲区
const char* const paramValues[] = {buffer};
const int nParams = sizeof(paramValues) / sizeof(paramValues[0]);
const int paramLenghts[] = {buffer_size };
const int paramFormats[] = {1 }; /*binary */


PQexecParams(
             conn,
             "INSERT INTO images (img) VALUES($1::bytea)",
             nParams,
             NULL, /* Types of parameters, unused as casts will define types */
             paramValues,
             paramLenghts,
             paramFormats,
             0
         );

在 postgres 表中,我在 bytea 字段中有数据,但是如果我在文件上手动复制和粘贴,我看不到图像,因为它说不是 jpeg 图像...... postgres 字符串与 mysql 不同(如果我用文本编辑器打开mysql)但我不明白为什么,因为我做了一个简单的复制和粘贴.. 有什么提示吗??

【问题讨论】:

  • postgres 字符串 大概是 bytea 内容的文本表示。就像您使用 C++ 插入图像一样,使用 C++ 将其提取到文件中,而不是从某些未指定的可视化工具中复制/粘贴。
  • 我考虑过这种可能性..我使用 pgadmin...与 mysql 工作台我可以从表中看到直接图像,但 pgadmin 不提供这种东西,所以我尝试了这种方式。 .我会试试
  • @DanielVérité 我尝试用 c++ 读取并写入文件,但图像已损坏......而且里面的字符串正是我从 pgadmin 看到的......加上我从 postgres 读取的长度比我在 mysql 上的要长得多:bytea 文件长度为 19253 字节,原始长度为 6728
  • 更新我尝试使用java加载图像打开它,它可以在postgres中工作,所以数据是正确的

标签: c++ mysql postgresql copy blob


【解决方案1】:

最有可能逃避是导致您的问题的原因。 Bytea 可以以文本或二进制模式返回。如果是文本模式,您将看到一个十六进制字符串或八进制转义字符串。在这种情况下,您需要先通过PQunescapeBytea 运行它。

如果这不是问题,那么下一步就是看看您是如何插入数据的。可能是您插入不正确,因此您的数据库中的数据已损坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2021-04-24
    • 2017-08-16
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多