web-dev-qa-db-ja.com

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

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

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

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

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

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

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

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

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

16
Amit

escape形式でencode(data bytea, format text)を試しましたか?その構文では、formatは次のいずれかになります。

  • base64
  • hex
  • escape

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

8
valgog

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

そのエンコーディングを知っているなら、それは簡単です。

  1. 入力文字列をエンコードされたリテラルとして受け取ります。
  2. 我々 encode それです。これはエスケープされた文字列(text型)を生成します。
  3. 次に、それをデコードして、byteaのタイプを取得する必要があります。
  4. byteaを取得しても、textに戻ることはできません。 convert_from を使用して、byteaがどのテキスト形式であるかを通知する必要があります。私たちはそれを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);
7
Evan Carroll

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

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

6
rogerdpack