Perl & MongoDB 二进制数据

标签 perl mongodb

来自 MongoDB手册:

By default, all database strings are UTF8. To save images, binaries, and other non-UTF8 data, you can pass the string as a reference to the database.

我正在获取页面并希望存储内容以供以后处理。

  • 我不能依赖元字符集,因为许多页面都有 utf8 内容但错误地声明了 iso-8859-1 或类似内容
  • 所以不能使用Encode(不知道原始字符集)
  • 因此,我想将内容简单地存储为 作为字节流(二进制数据)以供以后处理

我的代码片段:

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

但得到错误:

Wide character in subroutine entry at /opt/local/lib/perl5/site_perl/5.14.2/darwin-multi-2level/MongoDB/Collection.pm line 296.

这是我存储数据的唯一地方。

问题:在 MondoDB 中存储二进制数据的唯一方法是对它们进行编码,例如使用 base64?

最佳答案

看起来又是一个关于_utf8_标志的悲伤故事……

我可能错了,但似乎 HTTP::Message 的 headers_as_stringcontent 方法将它们的字符串作为字符序列返回。但是 MongoDB 驱动程序希望作为“二进制文件”显式传递给它的字符串是八位字节序列 - 因此是警告戏剧。

一个相当丑陋的解决方法是取消代码中 $rawhead 和 $rawbody 上的 utf8 标志(我想知道它不应该由 MongoDB 驱动程序本身完成吗?),通过类似这……

_utf8_off $rawhead; 
_utf8_off $rawbody; # ugh

另一种方法是使用 encode('utf8', $rawhead) - 但是你应该在从数据库中提取值时使用 decode ,我怀疑它不丑.

关于Perl & MongoDB 二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11115814/

相关文章:

bash - perl 如何通过 'cd $newdir' 完成脚本

perl - Perl 继承的首选约定是什么

xml - 解析出节点和属性 XML::LibXML

javascript - 使用 $addToSet 添加到 MongoDB 中的数组

perl - 用最后一个值填充剩余字段的简单算法

perl - Perl命令行解释器在退出时崩溃

$all 对面的 mongodb 查询

javascript - 使用 Node 管理 mongoDB 连接的正确方法是什么?

mongodb - 将 Azure 认知搜索连接到 MongoDB Cloud Atlas

mongodb - 如何在没有 `db.repairDatabase()` 的情况下回收已删除的空间?