【问题标题】:How to use LO datatype with postgresql?如何在 postgresql 中使用 LO 数据类型?
【发布时间】:2013-09-25 00:30:35
【问题描述】:

我目前正在尝试做的事情:

我正在使用一个以 Postgresql 作为后端数据库的软件。该软件提供了一个 API,该 API 使用 Web 服务与软件/数据库进行通信。我正在尝试通过 api 将图像插入数据库,通常应该是 BLOB,因为 postgresql 不支持,所以我使用 postgresql-contrib 包创建了 lo 扩展。现在,实际的大对象保存在它自己的表中,当前表只保存对该对象的引用,但是 API 不考虑这一点。我目前将图像列的数据类型作为 BYTEA,但我收到一条错误消息,提示“列‘img’的类型为 bytea,但表达式的类型为 lo;”。由于插入被封装在 Web 服务的后端,因此我在 API 中无能为力。我可以在 Postgres 本身中做些什么来允许 api 插入大对象吗?

TL;DR:

软件 API 期望将大对象 (BLOB) 放入数据库。如果数据库识别出 BLOB 数据类型,则应该可以无缝工作。 我已经在 postgres 中设置了 lo 扩展。 目前我将列数据类型设置为 bytea 但收到此错误: "列 'img' 的类型为 bytea,但表达式的类型为 lo;"。

我如何存储 lo's?

:::我使用的是 postgresql 9.1


我让它工作了。删除表后,我忘记重新创建 lo 扩展名,这就是它无法识别数据类型的原因。

【问题讨论】:

  • lobytea 存储完全不同。您不需要lo 扩展来存储bytea 并且您不能将lo 存储到bytea
  • 我明白了,但是如何存储lo?
  • 如果您想在数据库中存储图像(或任何其他文件) - 只需使用 bytea 并忘记 lolo 超过 bytea 的唯一好处是 2 GB 文件大小限制(相对于 1 GB)和对 lo 文件进行随机访问的能力。
  • 如果你真的想存储lo 对象 - 定义类型为lo(而不是bytea)的列来存储这个对象。但是当lo 列的行被删除时,您将不得不单独管理lo 对象,因为它们没有被删除。
  • 我得到:'column "img" cannot be cast to type lo'

标签: java database postgresql postgresql-9.1


【解决方案1】:

将文件传输到数据库的最简单(但不是最有效)的方法是将文件编码为HEXbase64 将它们传输为varchardecodebytea 类型,然后再存储到@987654326 @ 场地。

与从 db 中检索文件的方式相同。

如果您想在没有编码/解码开销的情况下传输bytea - 那么您必须研究您的驱动程序、语言和框架如何处理它。

【讨论】:

  • 不幸的是,这不是一个选项,因为该软件的网络服务将图像作为 lo 并且仅作为 lo 发送。
  • @JHP 我还没有听说过一个知道 postgres lo 类型的软件。您是在谈论 postgres 特殊的 lo 类型还是一般 BLOBS ?
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2019-01-09
  • 2015-03-09
  • 2018-06-11
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多