【发布时间】: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 扩展名,这就是它无法识别数据类型的原因。
【问题讨论】:
-
lo和bytea存储完全不同。您不需要lo扩展来存储bytea并且您不能将lo存储到bytea列 -
我明白了,但是如何存储lo?
-
如果您想在数据库中存储图像(或任何其他文件) - 只需使用
bytea并忘记lo。lo超过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