PostgreSQL 8.4 kullanarak, bytea postgres metin değerine dönüştürmek nasıl?


16

Uygulamamda C kodu kullanarak veritabanına veri ekliyorum, çünkü güvenilmeyen bir kaynaktan aldığım dizeler PQescapeByteaConnlibpq kütüphanesini kullanarak bunlardan kaçtım . Hangi gayet iyi çalışıyor yani Octet biçimi Dize sonuçları. Aşağıdaki örneğe bakın,

Giriş Dizesi: \n\t\f\b\p\k\j\l\mestPrepared

Çıktı Dizesi: \\012\\011\\014\\010pkjlmestPrepared

Çıktı Dizesi veritabanına eklenir. Şimdi veriyi JDBC kullanarak bir java kodunda veritabanından alıyorum. Dizeyi orijinal değerine geri nasıl kaldırabilirim?

İki olası yaklaşım düşündüm,

  1. Veritabanı alma sorgusunu değiştirin ve bu alanı postgres, yani bytea'yı metne dönüştürebilecek herhangi bir String manipülasyon fonksiyonuna geçirin.
  2. Kod çözmeyi Java kodunda yapın.

1. yaklaşımın daha verimli olacağını anlayabiliyorum. Burada listelenen hemen hemen tüm fonksiyonları denedim ama hiçbir şey çalışmıyor. Lütfen yardım et!!

Linux makinede postgres 8.4 sürümünü kullanıyorum.


2
JDBC sürücüsünün bytea kodunu çözmesi gerekiyor. Sorun nedir ResultSet.getBytes()?
Daniel Vérité

@ DanielVérité Bunu deneyeceğim ve bunu size bildireceğim
Amit

Yanıtlar:


8

Format encode(data bytea, format text)ile denediniz mi? escapeBu sözdiziminde formatbunlardan herhangi biri olabilir,

  • base64
  • büyü
  • kaçış

Böylece encode(E'123\\000456'::bytea, 'hex')bytea'yı onaltılık kodlu olarak çıktılar.


Sorunu çözdüğünden emin değilseniz, bu soru üzerine bir yorum olmalıdır. Sorunu çözerse, gelecekteki okuyucuların yararına bunun neden ve nasıl çalıştığı hakkında ayrıntılı bilgi verebilir misiniz?
Max Vernon

@Valgog Ben zaten denedim ..
Amit

6

BYTEA'yı TEXT'e dönüştürmek metnin dahili kodlamasını bilmenizi gerektirir. Kodlamayı bilmeden yapabileceğiniz hiçbir şey yoktur. Normal bir textsütunda, veritabanı metni SERVER_ENCODINGayarlandığı gibi depolar . Örneğin, örneğinize \nçevrilir \012. Bu, kodlamanın bir özelliği. Evren için nesnel olarak doğru değil.

Bu kodlamayı biliyorsanız, ancak basittir ..

  1. Giriş dizenizi kodlanmış bir değişmez sayı olarak alıyoruz.
  2. Biz encodeöyle. Bu çıkış karakterli bir dize (tür text) üretir .
  3. Sonra bir tür almak için geri deşifre etmek zorundayız bytea.
  4. Şimdi sahip olmak byteageri dönmemize izin vermiyor text. Biz bu ne metin biçimi bunu anlatmak zorunda byteakullanarak bulunuyor convert_from. UTF-8 diyoruz.

İşte bir örnek.

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

Takipçiler için, bu "bytea'yı metne dönüştürmek" için kanonik bir soru gibi göründüğünden (yani aslında pgAdmin'de görebilirsiniz). Nasıl görüntülenebilir:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.