2012-06-20 42 views
8

Từ hướng dẫn MongoDB:Perl & MongoDB dữ liệu nhị phân

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.

Tôi lấy trang và muốn lưu trữ các nội dung để chế biến sau đó.

  • tôi không thể dựa vào meta charset, do có nhiều trang có nội dung utf8 nhưng sai tuyên bố iso-8859-1 hoặc tương tự
  • vì vậy không thể sử dụng Encode (không biết charset có nguồn gốc)
  • do đó, tôi muốn lưu trữ các nội dung đơn giản as flow of bytes (dữ liệu nhị phân) để chế biến sau

Fragment mã của tôi:

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

Nhưng nhận được lỗi:

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

Đây là nơi duy nhất mà tôi lưu trữ dữ liệu.

Câu hỏi: Cách duy nhất lưu trữ dữ liệu nhị phân trong MondoDB là mã hóa chúng, ví dụ: với base64?

+0

Nó sẽ đưa ra cảnh báo tương tự nếu bạn đặt '$ rawhead' và' $ rawbody' thành mẫu được đưa ra trong sách hướng dẫn (ví dụ: '" \ xFF \ xFE \ xFF "')? – raina77ow

Trả lời

4

Dường như một câu chuyện buồn về _utf8_ cờ ...

Tôi có thể sai, nhưng có vẻ như headers_as_stringcontent phương pháp HTTP :: nhắn trở lại chuỗi của họ như là một chuỗi các ký tự. Tuy nhiên, trình điều khiển MongoDB hy vọng các chuỗi được truyền cho nó một cách rõ ràng như 'nhị phân' là một chuỗi các octet - do đó là bộ phim cảnh báo.

Một sửa chữa chứ không phải xấu xí là để đi xuống các utf8 cờ trên $ rawhead và $ rawbody trong mã của bạn (Tôi tự hỏi không nên nó được thực sự thực hiện bằng cách MongoDB tài xế riêng của mình?), Bởi một cái gì đó như thế này ...

_utf8_off $rawhead; 
_utf8_off $rawbody; # ugh 

Cách khác là sử dụng encode('utf8', $rawhead) - nhưng sau đó bạn nên sử dụng decode khi trích xuất giá trị từ DB và tôi nghi ngờ nó không xấu hơn.

0

Dữ liệu của bạn là ký tự chứ không phải octet. Giả định của bạn dường như là bạn chỉ truyền tải thông qua octet, nhưng bạn phải vi phạm giả định đó bằng cách nào đó bằng cách giải mã dữ liệu văn bản đến, có lẽ ngay cả khi bạn không nhận thấy.

Vì vậy, chỉ đơn giản là không giải mã, dữ liệu ở lại octet, lưu trữ vào db sẽ không thất bại.

Các vấn đề liên quan