2013-03-27 4 views
0

У меня есть некоторые байты, которые мне нужно вставить.Вставить строку байта в MongoDB

> db.test2.t.insert({'e': '\xa0\xc7e\xea\x14\xbeg\xb7\xdf\xcagFN\xf8\x13\xbe'}) 
> db.test2.t.insert({'e': '\xa0\xc7e\xea\x14\xbeg\xb7\xdf\xcagFN\xf8\x13\xbe'}) 
> db.test2.t.find() 
{ "_id" : ObjectId("5152e927d50568b4a9b56cdd"), "e" : " Çeê\u0014¾g·ßÊgFNø\u0013¾" } 
{ "_id" : ObjectId("5152e9e9d50568b4a9b56cde"), "e" : " Çeê\u0014¾g·ßÊgFNø\u0013¾" } 

Я не могу прочитать ту же самую строку байт в Python:

>>> e = " Çeê\u0014¾g·ßÊgFNø\u0013¾" 
>>> e 
'\xc2\xa0\xc3\x87e\xc3\xaa\\u0014\xc2\xbeg\xc2\xb7\xc3\x9f\xc3\x8agFN\xc3\xb8\\u0013\xc2\xbe' 
>>> g = b'\xa0\xc7e\xea\x14\xbeg\xb7\xdf\xcagFN\xf8\x13\xbe' 
>>> g 
'\xa0\xc7e\xea\x14\xbeg\xb7\xdf\xcagFN\xf8\x13\xbe' 

Спасибо.


Encode в utf8

>>> u'\xa0\xc7e\xea\x14\xbeg\xb7\xdf\xcagFN\xf8\x13\xbe'.encode('utf8') 
'\xc2\xa0\xc3\x87e\xc3\xaa\x14\xc2\xbeg\xc2\xb7\xc3\x9f\xc3\x8agFN\xc3\xb8\x13\xc2\xbe' 

Когда я ввожу, что я получаю

{ "_id" : ObjectId("5152ee3ad50568b4a9b56ce0"), "e" : " Ãeê\u0014¾g·ÃÃgFNø\u0013¾" } 

Но ясно, когда я расшифровать, что с utf8,

u'\xc2\xa0\xc3\x87e\xc3\xaa\\u0014\xc2\xbeg\xc2\xb7\xc3\x9f\xc3\x8agFN\xc3\xb8\\u0013\xc2\xbe' 

Это что я ставлю Отлично. Но как мне декодировать обратно на исходный?

+0

Может быть проблема кодирования? Возможно, MongoDB использует различную кодировку символов, чем Python. – Philipp

+0

MongoDB использует кодировку UTF-8 для хранения байтовых массивов в виде двоичных данных. Попробуйте кодировать строку как UTF-8 –

+0

Спасибо обеим. @orid Я не думаю, что могу кодировать его как utf8 из-за '' UnicodeDecodeError: кодек ascii не может декодировать байт 0xa0 в позиции 0: порядковый номер не в диапазоне (128) ''. выполнив '' byte_string.encode ('utf-8') '' – User007

ответ

0

Используйте тип Binary:

> db.test.t.insert({'e': BinData(0, 'oMdl6hS+Z7ffymdGTvgTvg==')}) 
WriteResult({ "nInserted" : 1 }) 
> db.test.t.insert({'e': BinData(0, 'oMdl6hS+Z7ffymdGTvgTvg==')}) 
WriteResult({ "nInserted" : 1 }) 
> db.test.t.find() 
{ "_id" : ObjectId("56e4a1d51b696fa210e6d074"), "e" :  BinData(0,"oMdl6hS+Z7ffymdGTvgTvg==") } 
{ "_id" : ObjectId("56e4a1d71b696fa210e6d075"), "e" :  BinData(0,"oMdl6hS+Z7ffymdGTvgTvg==") } 

И из Python:

>>> cli.test.test.t.find() 
[{u'_id': ObjectId('56e4a1d51b696fa210e6d074'), u'e': Binary('\xa0\xc7e\xea\x14\xbeg\xb7\xdf\xcagFN\xf8\x13\xbe', 0)}, 
{u'_id': ObjectId('56e4a1d71b696fa210e6d075'), u'e': Binary('\xa0\xc7e\xea\x14\xbeg\xb7\xdf\xcagFN\xf8\x13\xbe', 0)}] 
Смежные вопросы