Используя PostgreSQL 8.4, как преобразовать bytea в текстовое значение в postgres?

15

В моем приложении я вставляю данные в базу данных, используя код на C, так как строки, которые я получаю из ненадежного источника, я избежал их, используя PQescapeByteaConnбиблиотеку libpq. Который работает отлично, то есть приводит к формату строки Octet. Смотрите ниже пример,

Строка ввода : \n\t\f\b\p\k\j\l\mestPrepared

Выходная строка: \\012\\011\\014\\010pkjlmestPrepared

Выходная строка вставляется в базу данных. Теперь я получаю эти данные из базы данных в виде кода Java, используя JDBC. Как я могу удалить строку обратно к ее первоначальному значению?

Я думал о двух возможных подходах,

  1. Измените запрос поиска в базе данных и передайте это поле любой функции обработки строк Postgres, т. Е. Которая может преобразовывать байты в текст.
  2. Делайте декодирование в коде Java.

Я могу понять, что подход 1 будет более эффективным. Я перепробовал почти все функции, перечисленные здесь, но ничего не работает. Пожалуйста помоги!!

Я использую версию 8.4 postgres на машине с Linux.

Amit
источник
2
Драйвер JDBC должен декодировать bytea. Что не так с ResultSet.getBytes()?
Даниэль Верите
@ DanielVérité Я попробую это и сообщу тебе об этом
Амит

Ответы:

8

Вы пробовали encode(data bytea, format text)с escapeформатом. В этом синтаксисе formatможет быть любой из них,

  • base64
  • наговор
  • побег

Так encode(E'123\\000456'::bytea, 'hex')будет выводить байту в шестнадцатеричном виде.

valgog
источник
Это должен быть комментарий к вопросу, если вы не уверены, что он решит проблему. Если это решит проблему, можете ли вы рассказать, почему и как это работает на благо будущих читателей?
Макс Вернон
@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);
Эван Кэрролл
источник
4

Для последователей, так как это кажется каноническим вопросом для «преобразования байты в текст» (то есть, чтобы вы могли увидеть это в pgAdmin и т. Д.). Вот как это сделать:

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

rogerdpack
источник