2012-06-20 18 views
8

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, 
          } 
         } 
        ); 
    } 
    
    :
  • इसलिए, मैं बाद में प्रसंस्करण

मेरे कोड का टुकड़ा के लिए सामग्री बस as flow of bytes (बाइनरी डेटा) की दुकान चाहते हैं

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

यह केवल जगह है जहाँ मैं डेटा भंडारण है: 10

लेकिन त्रुटि मिलती है।

प्रश्न: मोंडो डीबी में स्टोर बाइनरी डेटा का एकमात्र तरीका उन्हें एन्कोड करता है उदा। बेस 64 के साथ?

+0

यदि आप मैन्युअल में दिए गए नमूने में '$ कच्चेहेड 'और' $ rawbody' 'सेट करते हैं, तो यह वही चेतावनी देगा (यानी, \" \ xFF \ xFE \ xFF "')? – raina77ow

उत्तर

4

यह एक और दुखद कहानी _utf8_ के बारे में झंडा ...

मैं गलत हो सकता है की तरह लग रहा है, लेकिन ऐसा लगता है कि HTTP की :: संदेश headers_as_string और content तरीकों वर्णों के क्रम के रूप में अपने सूत्र। लेकिन मोंगोडीबी चालक उम्मीद करता है कि तारों को 'बाइनरी' के रूप में स्पष्ट रूप से पारित किया गया है ताकि ऑक्टेट्स का अनुक्रम हो - इसलिए चेतावनी नाटक।

एक नहीं बल्कि बदसूरत ठीक (मुझे आश्चर्य है कि नहीं यह वास्तव में MongoDB ड्राइवर से ही किया जाना चाहिए?), अपने कोड में $ rawhead पर utf8 झंडा और $ rawbody नीचे लेने के लिए कुछ इस तरह से है ...

_utf8_off $rawhead; 
_utf8_off $rawbody; # ugh 

विकल्प encode('utf8', $rawhead) का उपयोग करना है - लेकिन फिर आपको decode का उपयोग डीबी से मूल्य निकालने के दौरान करना चाहिए, और मुझे संदेह है कि यह उलझन में नहीं है।

0

आपका डेटा वर्ण है, ऑक्टेट्स नहीं। आपकी धारणा यह प्रतीत होती है कि आप केवल ऑक्टेट्स के माध्यम से चीजों को पार कर रहे हैं, लेकिन आपने किसी भी तरह से आने वाले टेक्स्ट डेटा को डीकोड करके अनुमान लगाया होगा, शायद बिना किसी ध्यान के।

तो बस डीकोड न करें, डेटा रहने वाले ऑक्टेट्स, डीबी में संग्रहीत करने में असफल रहेगा।

संबंधित मुद्दे