私のアプリケーションでは、Cコードを使用してデータベースにデータを挿入しています。信頼できないソースから受け取った文字列は、libpqライブラリのPQescapeByteaConn
を使用してエスケープしています。これは完全に正常に機能しています。つまり、Octet形式の文字列になります。以下の例を参照してください。
入力文字列:\n\t\f\b\p\k\j\l\mestPrepared
出力文字列:\\012\\011\\014\\010pkjlmestPrepared
出力文字列がデータベースに挿入されます。ここで、JDBCを使用してJavaコードでデータベースからそのデータを取得します。文字列を元の値に戻すにはどうすればよいですか?
私は2つの可能なアプローチを考えました、
アプローチ1の方が効率的であることは理解できます。私はリストされているほぼすべての関数 here を試しましたが、何も機能していません。助けてください!!
Linuxマシンでpostgresのバージョン8.4を使用しています。
escape
形式でencode(data bytea, format text)
を試しましたか?その構文では、format
は次のいずれかになります。
したがって、encode(E'123\\000456'::bytea, 'hex')
は、byteaを16進エンコードで出力します。
BYTEAをTEXTに変換するには、テキストの内部エンコーディングを知っている必要があります。エンコーディングを知らなければ、あなたにできることは何もありません。通常のtext
列では、データベースはテキストをSERVER_ENCODING
に設定されているとおりに格納します。たとえば、あなたの例では\n
は\012
に翻訳されます。まあ、それはエンコーディングの特性です。それは宇宙にとって客観的に真実ではありません。
そのエンコーディングを知っているなら、それは簡単です。
encode
それです。これはエスケープされた文字列(text
型)を生成します。bytea
のタイプを取得する必要があります。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);
フォロワーにとって、これは「byteaをテキストに変換する」ための標準的な質問のようです(つまり、実際にpgAdminなどで確認できます)。表示する方法は次のとおりです。
select encode(table.your_column_name, 'escape') as some_name from table_name