使用 PostgreSQL 8.4,如何在 postgres 中将 bytea 转换为文本值?

Ami*_*mit 25 postgresql encoding postgresql-8.4 string bytea

在我的应用程序中,我使用 C 代码在数据库中插入数据,因为我从不受信任的来源收到的字符串我已经使用PQescapeByteaConnlibpq 库对它们进行了转义。哪个工作得很好,即结果为八位字节格式字符串。看下面的例子,

输入字符串: \n\t\f\b\p\k\j\l\mestPrepared

输出字符串: \\012\\011\\014\\010pkjlmestPrepared

输出字符串被插入到数据库中。现在,我使用 JDBC 从 Java 代码中的数据库中检索该数据。如何将字符串转义回其原始值?

我想到了两种可能的方法,

  1. 更改数据库检索查询并将此字段传递给 postgres 的任何字符串操作函数,即可以将 bytea 转换为文本。
  2. 在Java代码中进行解码。

我可以理解方法 1 会更有效。我已经尝试了这里列出的几乎所有功能但没有任何效果。请帮忙!!

我在 linux 机器上使用 8.4 版的 postgres。

rog*_*ack 16

对于追随者,因为这似乎是“将 bytea 转换为文本”的规范问题(即,您实际上可以在 pgAdmin 等中看到它)。这是使其可见的方法(假设your_column_name是 type bytea

select encode(table.your_column_name, 'escape') as your_alias_name from table_name


小智 14

您是否尝试过encode(data bytea, format text)withescape格式。在该语法中format可以是这些中的任何一个,

  • base64
  • 十六进制
  • 逃脱

所以encode(E'123\\000456'::bytea, 'hex')将以十六进制编码输出字节。


Eva*_*oll 13

将 BYTEA 转换为 TEXT 需要您知道文本的内部编码。在不知道编码的情况下,您无能为力。在普通text列中,数据库将文本存储SERVER_ENCODING为设置的任何内容。例如,在您的示例中\n被翻译成\012. 嗯,这是编码的一个属性。对于宇宙来说,这不是客观真实的。

但是,如果您知道该编码,那就很简单了..

  1. 我们将您的输入字符串作为编码文字。
  2. 我们encode它。这会产生一个转义的字符串(类型text)。
  3. 然后我们必须将它解码回来以获得bytea.
  4. 现在拥有 abytea不允许我们回到text. 我们必须告诉它bytea使用的是什么文本格式convert_from。我们告诉它UTF-8。

这是一个例子。

SELECT convert_from(decode(x, 'escape'), 'UTF-8')
FROM encode(E'\n\t\f\b\p\k\j\l\mestPrepared'::bytea, 'escape')
  AS t(x);
Run Code Online (Sandbox Code Playgroud)