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


16

在我的应用程序中,我使用C代码将数据插入数据库中,因为从不可信来源收到的字符串已经使用PQescapeByteaConnlibpq库转义了。这工作得很好,即以八位字节格式生成字符串。参见以下示例,

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

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

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

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

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

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

我正在Linux机器上使用PostgreSQL的8.4版本。


2
JDBC驱动程序应该解码bytea。这有什么错ResultSet.getBytes()
DanielVérité13年

@DanielVérité我会尝试一下,并让您知道
Amit

Answers:


8

您是否尝试过encode(data bytea, format text)with escape格式。该语法format可以是任何一种,

  • base64
  • 十六进制
  • 逃逸

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


除非您确定它可以解决问题,否则这应该是对该问题的评论。如果确实可以解决问题,那么您能否详细说明为什么以及如何这样做才能使将来的读者受益?
Max Vernon

@Valgog我已经尝试过了。–
Amit

6

将BYTEA转换为TEXT要求您了解文本的内部编码。不知道编码,您无能为力。在普通text列中,数据库将文本存储SERVER_ENCODING为设置为的内容。例如,在您的示例中,\n将其翻译为\012。好吧,这是编码的属性。对于宇宙来说,这并不是客观上的真实。

如果您知道该编码,则很简单。

  1. 我们将您的输入字符串作为编码文字。
  2. 我们encode。这将产生一个转义的字符串(类型text)。
  3. 然后,我们必须将其解码回去,以得到的类型bytea
  4. 现在拥有bytea不允许我们返回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);

5

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.