PostgreSQL 8.4を使用して、postgresでbyteaをテキスト値に変換する方法は?


15

私のアプリケーションでは、Cコードを使用してデータベースにデータを挿入します。信頼できないソースから受け取った文字列PQescapeByteaConnはlibpqライブラリを使用してエスケープしているためです。これは完全に正常に機能しています。つまり、Octet形式の文字列になります。以下の例を参照してください、

入力文字列: \n\t\f\b\p\k\j\l\mestPrepared

出力文字列: \\012\\011\\014\\010pkjlmestPrepared

出力文字列がデータベースに挿入されます。次に、JDBCを使用してJavaコードでデータベースからそのデータを取得します。文字列を元の値に戻すにはどうすればよいですか?

私は2つの可能なアプローチを考えました、

  1. データベース検索クエリを変更し、このフィールドをpostgresの文字列操作関数、つまりbyteaをテキストに変換できる関数に渡します。
  2. Javaコードでデコードを行います。

アプローチ1の方が効率的であることを理解できます。ここにリストされているほとんどすべての機能を試しましたが、何も機能していません。助けてください!!

Linuxマシンでpostgresのバージョン8.4を使用しています。


2
JDBCドライバーはbyteaをデコードすることになっています。何が問題なのResultSet.getBytes()ですか?
ダニエルベリテ

@DanielVérité私はそれを試して、それについてあなたにお知らせします
アミット

回答:


8

encode(data bytea, format text)with escapeフォーマットを試しましたか。その構文でformatは、これらのいずれかになります。

  • base64
  • ヘックス
  • 逃れる

したがってencode(E'123\\000456'::bytea, 'hex')、byteaを16進エンコードとして出力します。


問題を解決できることが確実でない限り、これは質問に対するコメントでなければなりません。問題が解決する場合、将来の読者の利益のためにこれがなぜ機能し、どのように機能するかについて詳しく説明してください。
マックスヴァーノン

@Valgog私はすでにそれを試してみました..-
アミット

6

BYTEAをTEXTに変換するには、テキストの内部エンコードを知っている必要があります。エンコーディングを知らないと、できることは何もありません。通常のtext列では、データベースSERVER_ENCODINGは設定どおりにテキストを保存します。たとえば、あなたの例で\nはに翻訳され\012ます。まあ、それはエンコードのプロパティです。宇宙に対して客観的には真実ではありません。

ただし、そのエンコーディングを知っていれば、それは簡単です。

  1. 入力文字列をエンコードされたリテラルとして受け取ります。
  2. 私たちencode。これにより、エスケープ文字列(タイプtext)が生成されます。
  3. 次に、それをデコードして、のタイプを取得する必要がありbyteaます。
  4. を持ってbyteaいるので、に戻ることはできませんtextbytea使用するテキスト形式を指定する必要がありますconvert_from。UTF-8を指定します。

以下に例を示します。

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);

4

フォロワーにとって、これは「byteaをテキストに変換する」ための標準的な質問のようです(つまり、pgAdminなどで実際に見ることができます)。表示可能にする方法は次のとおりです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.