7

我正在尝试将二进制数据存储在数据库中。(heroku 上的 postgresql)

我知道有两种不同的方法可以在 postgresql 中存储二进制数据。一个blob和一个bytea..

当我在迁移中创建表时,

create_table :binaries do |t|
  t.binary :data
end

它在 bytea 类型的数据库中创建一个列。

我的问题是..如何创建 blob 类型的记录?

我为什么要问?似乎当我将一个 10 字节的文件发送到 heroku 时,它将它存储为一个十六进制值的字符串,前面带有一个“e”.. 所以我的 10 字节变成了 21。我的 10 兆文件将变成 20 兆(和一个字节),分机,分机,分机......
现在这让我很困扰,但因为我并不真正关心性能。(我已经被总理打败了),这不是最困扰我的事情。
真正困扰我的是;当我读出数据库的内容时,我得到了 21 个字节,而不是 10 个字节。那是不可用的。

所以我的问题又来了。如何在 rails/postgresql/heroku 环境中创建一个 BLOB 列?

4

2 回答 2

11

bytea是 PostgreSQL 的 BLOB 版本。来自精美手册

SQL 标准定义了一种不同的二进制字符串类型,称为BLOBor BINARY LARGE OBJECT。输入格式与 不同bytea,但提供的函数和运算符大体相同。

bytea想要的也是如此。就格式而言:

bytea类型支持两种外部输入和输出格式:PostgreSQL 历史上的“转义”格式和“十六进制”格式。这两个总是在输入时被接受。输出格式取决于配置参数 bytea_output;默认值为十六进制。(请注意,十六进制格式是在 PostgreSQL 9.0 中引入的;早期版本和一些工具不理解它。)

因此,您所看到的只是用于将数据输入数据库和从数据库输出的文本版本。

这可能也很有趣:

于 2012-07-12T05:30:00.827 回答
3

Blob 存储内置在 Postgres 中,并使用 ActiveRecord 适配器支持,但只能直接通过原始连接和lo_*方法。您可以使用它lo_write, lo_open, lo_close and lo_read来创建和操作 blob。创建 blob 会返回一个 OID,您可以在模型中引用该 blob。

您可以使用迁移添加它

rails g migration AddFileToModel file:oid

或者直接这样

add_column :users, :avatar, :oid

对于这方面的工作示例,您应该查看Carrierwave PostgreSQL gem。您可以基于该代码构建自定义解决方案,也可以直接使用 Carrierwave。我目前正在使用它并且效果很好。

于 2014-08-07T21:16:06.627 回答