8

MongoDBマニュアルから:

デフォルトでは、すべてのデータベース文字列はUTF8です。画像、バイナリ、およびその他の非UTF8データを保存するために、データベースへの参照として文字列を渡すことができます。

ページを取得していて、後で処理するためにコンテンツを保存したいと思います。

  • 多くのページにutf8コンテンツが含まれているが、iso-8859-1などを誤って宣言しているため、メタ文字セットに依存できません。
  • したがって、使用できませんEncode(元の文字セットがわかりません)
  • as flow of bytesしたがって、後で処理するためにコンテンツ(バイナリデータ)を単純に保存したい

私のコードの断片:

sub save {
    my ($self, $ok, $url, $fetchtime, $request ) = @_;

    my $rawhead = $request->headers_as_string;
    my $rawbody = $request->content;

    $self->db->content->insert(
        { "url" => $url, "rhead" => \$rawhead, "rbody" => \$rawbody } ) #using references here
      if $ok;

    $self->db->links->update(
        { "url" => $url },
        {
            '$set' => {
                'status'       => $request->code,
                'valid'        => $ok,
                'last_checked' => time(),
                'fetchtime'    => $fetchtime,
            }
        }
    );
}

しかし、エラーが発生します:

/opt/local/lib/perl5/site_perl/5.14.2/darwin-multi-2level/MongoDB/Collection.pm行296のサブルーチンエントリのワイド文字。

これは私がデータを保存する唯一の場所です。

質問:MondoDBにバイナリデータを保存する唯一の方法は、たとえばbase64でそれらをエンコードすることですか?

4

2 に答える 2

4

_utf8_旗についての別の悲しい話のように見えます...

私は間違っているかもしれませんが、HTTP::Messageheaders_as_stringcontentメソッドは文字列を文字のシーケンスとして返すようです。ただし、MongoDBドライバーは、「バイナリ」として明示的に渡される文字列がオクテットのシーケンスであることを想定しています。したがって、警告ドラマです。

かなり醜い修正はutf8、コード内の$rawheadと$rawbodyのフラグを削除することです(実際にはMongoDBドライバー自体によって行われるべきではないのでしょうか?)、次のような方法で...

_utf8_off $rawhead; 
_utf8_off $rawbody; # ugh

別の方法はを使用することですencode('utf8', $rawhead)が、DBから値を抽出するときに使用する必要がdecodeあり、醜いものではないと思います。

于 2012-06-20T09:53:42.520 に答える
0

データは文字であり、オクテットではありません。あなたの仮定は、あなたが単にオクテットとして物事を通過しているということのようですが、おそらくあなたが気付かないうちに、入ってくるテキストデータをデコードすることによって、何らかの形で以前にその仮定に違反したに違いありません。

したがって、単にデコードしないでください。データはオクテットのままで、データベースへの保存は失敗しません。

于 2012-06-20T09:37:46.990 に答える