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 PQescapeByteaConn
perpustakaan 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,
- Ubah kueri pencarian basis data dan berikan bidang ini ke fungsi manipulasi String postgres yaitu yang dapat mengubah bytea menjadi teks.
- 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.
ResultSet.getBytes()
?Jawaban:
Sudahkah Anda mencoba format
encode(data bytea, format text)
withescape
. Dalam sintaks ituformat
bisa salah satu dari ini,Jadi
encode(E'123\\000456'::bytea, 'hex')
akan menampilkan bytea sebagai hex-encoded.sumber
Mengubah BYTEA ke TEXT mengharuskan Anda untuk mengetahui penyandian internal teks. Tanpa mengetahui encoding, tidak ada yang bisa Anda lakukan. Dalam
text
kolom normal , database menyimpan teks sebagai apa punSERVER_ENCODING
yang diatur sebagai. Misalnya, dalam contoh Anda\n
diterjemahkan ke dalam\012
. Ya, itu adalah properti pengkodean. Itu tidak benar secara objektif untuk alam semesta.Jika Anda tahu pengkodean itu, sederhana saja ..
encode
itu. Ini menghasilkan string (tipetext
) yang diloloskan .bytea
.bytea
tidak mengizinkan kami untuk kembalitext
. Kami harus memberi tahu format teks apa yangbytea
digunakanconvert_from
. Kami mengatakannya UTF-8.Berikut ini sebuah contoh.
sumber
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
sumber