Używając PostgreSQL 8.4, jak przekonwertować bytea na wartość tekstową w postgresie?

16

W mojej aplikacji wstawiam dane do bazy danych przy użyciu kodu C, ponieważ ciągi, które otrzymuję z niezaufanego źródła, uniknąłem ich przy użyciu PQescapeByteaConnbiblioteki libpq. Który działa idealnie dobrze, tj. Wyniki w formacie ciąg znaków Octet. Zobacz poniższy przykład

Ciąg wejściowy: \n\t\f\b\p\k\j\l\mestPrepared

Łańcuch wyjściowy: \\012\\011\\014\\010pkjlmestPrepared

Łańcuch wyjściowy jest wstawiany do bazy danych. Teraz pobieram te dane z bazy danych w kodzie Java za pomocą JDBC. Jak mogę cofnąć scenografię ciągu z powrotem do jego oryginalnej wartości?

Myślałem o dwóch możliwych podejściach,

  1. Zmień zapytanie pobierania bazy danych i przekaż to pole do dowolnej funkcji manipulacji ciągiem postgres, tj. Która może konwertować bajt na tekst.
  2. Wykonaj dekodowanie w kodzie Java.

Rozumiem, że podejście 1 będzie bardziej wydajne. Próbowałem prawie wszystkich wymienionych tutaj funkcji , ale nic nie działa. Proszę pomóż!!

Używam wersji 8.4 postgres na maszynie z systemem Linux.

Amit
źródło
2
Sterownik JDBC powinien dekodować bajt. Co jest nie tak z ResultSet.getBytes()?
Daniel Vérité
@ DanielVérité Spróbuję i dam o tym znać
Amit

Odpowiedzi:

8

Czy próbowałeś encode(data bytea, format text)z escapeformatem. W tej składni formatmoże być dowolny z nich,

  • base64
  • klątwa
  • ucieczka

Więc encode(E'123\\000456'::bytea, 'hex')wyświetli bajt jako kodowany heksadecymalnie.

kaszmir
źródło
To powinien być komentarz do pytania, chyba że jesteś pewien, że to rozwiąże problem. Jeśli to rozwiąże problem, czy możesz wyjaśnić, dlaczego i jak to działa z korzyścią dla przyszłych czytelników?
Max Vernon
@ Valgog Próbowałem już tego
Amit
6

Konwersja BYTEA na TEXT wymaga znajomości wewnętrznego kodowania tekstu. Bez znajomości kodowania nic nie możesz zrobić. W normalnej textkolumnie baza danych przechowuje tekst tak, jak SERVER_ENCODINGjest ustawiony jako. Na przykład w twoim przykładzie \nzostanie przetłumaczony na \012. Cóż, to właściwość kodowania. Nie jest to obiektywnie prawdziwe dla wszechświata.

Jeśli znasz to kodowanie, jest to jednak proste ...

  1. Bierzemy twój ciąg wejściowy jako zakodowany literał.
  2. My encodeto. Powoduje to utworzenie łańcucha znaków (typu text).
  3. Następnie musimy go odkodować z powrotem, aby uzyskać rodzaj bytea.
  4. Teraz posiadanie byteanie pozwala nam wrócić do text. Musimy powiedzieć, jakiego formatu tekstu byteaużywa convert_from. Mówimy to UTF-8.

Oto przykład.

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);
Evan Carroll
źródło
5

Dla obserwujących, ponieważ wydaje się, że jest to kanoniczne pytanie dotyczące „konwersji bajtu na tekst” (tj. Tak, aby można go było zobaczyć w pgAdmin itp.). Oto, jak po prostu go wyświetlić:

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

rogerdpack
źródło