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 PQescapeByteaConn
biblioteki 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,
- 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.
- 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.
ResultSet.getBytes()
?Odpowiedzi:
Czy próbowałeś
encode(data bytea, format text)
zescape
formatem. W tej składniformat
może być dowolny z nich,Więc
encode(E'123\\000456'::bytea, 'hex')
wyświetli bajt jako kodowany heksadecymalnie.źródło
Konwersja BYTEA na TEXT wymaga znajomości wewnętrznego kodowania tekstu. Bez znajomości kodowania nic nie możesz zrobić. W normalnej
text
kolumnie baza danych przechowuje tekst tak, jakSERVER_ENCODING
jest ustawiony jako. Na przykład w twoim przykładzie\n
zostanie 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 ...
encode
to. Powoduje to utworzenie łańcucha znaków (typutext
).bytea
.bytea
nie pozwala nam wrócić dotext
. Musimy powiedzieć, jakiego formatu tekstubytea
używaconvert_from
. Mówimy to UTF-8.Oto przykład.
źródło
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
źródło