Використовуючи PostgreSQL 8.4, як перетворити байт у текстове значення у постгрес?


16

У своїй програмі я вставляю дані в базу даних, використовуючи код C, оскільки рядки, які я отримую з ненадійного джерела, я уникнув їх, використовуючи PQescapeByteaConnбібліотеку libpq. Що працює чудово, тобто призводить до струнного формату Октет. Дивіться нижче приклад,

Рядок введення: \n\t\f\b\p\k\j\l\mestPrepared

Вихідна рядок: \\012\\011\\014\\010pkjlmestPrepared

Вихідний рядок вставляється в базу даних. Тепер я отримую ці дані з бази даних в коді Java, використовуючи JDBC. Як я можу повернути рядок до початкового значення?

Я подумав два можливі підходи,

  1. Змініть запит на пошук бази даних та передайте це поле будь-якій функції String manipulation of postgres, тобто яка може перетворити байт у текст.
  2. Робіть розшифровку в коді Java.

Я можу зрозуміти, що підхід 1 буде більш ефективним. Я спробував майже всі перераховані тут функції, але нічого не працює. Будь ласка, допоможіть!!

Я використовую версію 8.4 постгресів на машині Linux.


2
Драйвер JDBC повинен декодувати байт. Що не так ResultSet.getBytes()?
Даніель Веріте

@ DanielVérité Я спробую це, і повідомляю про це
Amit

Відповіді:


8

Ви пробували encode(data bytea, format text)з escapeформатом. У цьому синтаксисі formatможе бути будь-який із них,

  • база64
  • шестигранний
  • Втеча

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


Це має бути коментарем до питання, якщо ви не впевнені, що це вирішує проблему. Якщо це все-таки вирішить проблему, чи можете ви детальніше пояснити, чому і як це працює на користь майбутніх читачів?
Макс Вернон

@Valgog Я вже пробував це ..
Аміт

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

Для послідовників, оскільки це, мабуть, є канонічним питанням для "перетворення байтів у текст" (тобто, таким чином, ви можете реально бачити його в pgAdmin тощо). Ось як просто зробити його видимим:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.