Menggunakan PostgreSQL 8.4, bagaimana cara mengubah bytea ke nilai teks di postgres?

15

Dalam aplikasi saya, saya memasukkan data dalam database menggunakan kode C, karena string yang saya terima dari sumber yang tidak terpercaya saya telah melarikan diri mereka menggunakan PQescapeByteaConnperpustakaan libpq. Yang berfungsi dengan baik yaitu hasil String format Octet. Lihat contoh di bawah ini,

Input String: \n\t\f\b\p\k\j\l\mestPrepared

Output String: \\012\\011\\014\\010pkjlmestPrepared

Output String dimasukkan ke dalam basis data. Sekarang saya mengambil data itu dari database dalam kode java menggunakan JDBC. Bagaimana saya bisa menghapus string kembali ke nilai aslinya?

Saya memikirkan dua pendekatan yang mungkin,

  1. Ubah kueri pencarian basis data dan berikan bidang ini ke fungsi manipulasi String postgres yaitu yang dapat mengubah bytea menjadi teks.
  2. Lakukan decoding dalam kode Java.

Saya bisa mengerti bahwa pendekatan 1 akan lebih efisien. Saya telah mencoba hampir semua fungsi yang tercantum di sini tetapi tidak ada yang berfungsi. Tolong bantu!!

Saya menggunakan postgres versi 8.4 pada mesin linux.

Amit
sumber
2
Driver JDBC seharusnya memecahkan kode bytea. Ada apa dengan ini ResultSet.getBytes()?
Daniel Vérité
@ DanielVérité Saya akan mencobanya dan memberi tahu Anda tentang hal itu
Amit

Jawaban:

8

Sudahkah Anda mencoba format encode(data bytea, format text)with escape. Dalam sintaks itu formatbisa salah satu dari ini,

  • base64
  • hex
  • melarikan diri

Jadi encode(E'123\\000456'::bytea, 'hex')akan menampilkan bytea sebagai hex-encoded.

anjing hutan
sumber
Ini harus menjadi komentar pada pertanyaan, kecuali Anda yakin itu menyelesaikan masalah. Jika itu benar-benar menyelesaikan masalah, dapatkah Anda menjelaskan mengapa dan bagaimana cara kerjanya untuk kepentingan pembaca di masa mendatang?
Max Vernon
@Valgog Saya sudah mencobanya ..
Amit
6

Mengubah BYTEA ke TEXT mengharuskan Anda untuk mengetahui penyandian internal teks. Tanpa mengetahui encoding, tidak ada yang bisa Anda lakukan. Dalam textkolom normal , database menyimpan teks sebagai apa pun SERVER_ENCODINGyang diatur sebagai. Misalnya, dalam contoh Anda \nditerjemahkan ke dalam \012. Ya, itu adalah properti pengkodean. Itu tidak benar secara objektif untuk alam semesta.

Jika Anda tahu pengkodean itu, sederhana saja ..

  1. Kami menganggap string masukan Anda sebagai literal yang disandikan.
  2. Kita encodeitu. Ini menghasilkan string (tipe text) yang diloloskan .
  3. Kemudian kita harus mendekodekannya kembali untuk mendapatkan tipe bytea.
  4. Sekarang memiliki byteatidak mengizinkan kami untuk kembali text. Kami harus memberi tahu format teks apa yang byteadigunakan convert_from. Kami mengatakannya UTF-8.

Berikut ini sebuah contoh.

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
sumber
4

Untuk pengikut, karena ini tampaknya menjadi pertanyaan kanonik untuk "mengubah bytea menjadi teks" (yaitu, sehingga Anda benar-benar dapat melihatnya di pgAdmin dll.). Berikut cara membuatnya terlihat:

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

rogerdpack
sumber