[pgsql-jp: 35983] encode() における bytea 型のバックスラッシュの扱い

Ryo HAYAKAWA ryo @ fastriver.net
2005年 9月 9日 (金) 16:50:09 JST


はじめまして。早川と申します。

encode() 関数を使用して bytea 型のデータをテキスト型に変換
しようとしています。この際のバックスラッシュ文字の扱いにつ
いて不明な点がございます。どなたがご存知の方がいらっしゃっ
たらご教示いただければと思いメール致しました。

以下のように encode() 関数を使用して、「\101」という bytea 
型の値が「A」に変換されると思います。

  pgdb=> select encode('\\101'::bytea, 'escape');
   encode
  --------
   A
  (1 row)

しかしながら、同様なことを、バックスラッシュを表す「\134」
という bytea 型の値に対して行うと、「\」ではなく「\\」とい
う結果が得られます。

  pgdb=> select encode('\\134'::bytea, 'escape');
   encode
  --------
   \\
  (1 row)

以下のようにしても同様です。

  pgdb=> select encode('\\\\'::bytea, 'escape');
   encode
  --------
   \\
  (1 row)

私としては「\」を期待しているのですが、これは何故でしょうか。
また、SQL レベルで回避する方法をご存知の方いらっしゃいます
でしょうか。

ちなみに、libpq の PQunescapeBytea()を使用すると、「\\」は
「\」に変換してくれるようです。以下のコードで試しています。

#include <stdio.h>
#include <libpq-fe.h>
int main(){
        char *out;
        size_t outsize;
        out = PQunescapeBytea("\\\\", &outsize);
        printf("unescape Result = %s\n", out);
}

-- はやかわ



pgsql-jp メーリングリストの案内