Сохранение данных Blob из базы данных SQLite в файл - PullRequest
4 голосов
/ 30 апреля 2010

Я пытаюсь сохранить данные больших двоичных объектов из базы данных SQLite (кэш Safari: Cache.db) в файл, но по какой-то причине sqlite не может прочитать весь большой двоичный объект. В конце концов я хотел бы сделать это в ruby, но сейчас то, что работает непосредственно в командной строке sqlite, хорошо. Кроме того, я прочитал все записи, которые говорят об этом здесь, на stackoverflow, но большинство из них только обсуждают производительность сохранения изображений в BLOB-объектах, и одна запись, которая показывает, чтобы сохранять BLOB-объекты в файл, находится в C #, что не помогает мне. Вот что я попробовал:

sqlite> select * from cfurl_cache_response limit 1; 3501 | 0 | 945281827 | 0 | http://www.gospelz.com/components/com_jomcomment/smilies/guest.gif|2010-02-24 16: 20: 07

sqlite> выбрать данные приемника из cfurl_cache_blob_data, где entry_ID = 3501;
GIF89a (

Шестнадцатеричная запись исходного файла (guest.gif) показывает, что sqlite прекращает чтение большого двоичного объекта после первого нулевого значения:

$ hexdump -C guest.gif
00000000 47 49 46 38 39 61 28 00 28 00 f7 00 00 f1 f5 fd | GIF89a (. (....... |

sqlite> .output test.gif
sqlite> выберите получатель_данных из cfurl_cache_blob_data, где entry_ID = 3501;
$ hexdump -C test.gif
00000000 47 49 46 38 39 61 28 0a | GIF89a (. |

Ответы [ 2 ]

7 голосов
/ 30 апреля 2010

SQLite3 читает весь BLOB-объект, но программа оболочки sqlite только отображает до NUL.

Чтобы проверить это, вы можете попробовать:

select hex( receiver_data ) from cfurl_cache_blob_data where entry_ID = 3501;
1 голос
/ 08 декабря 2011

Создание файла из блоба или двоичного файла довольно просто в Ruby. Вы делаете это так же, как вы пишете в файл. Например, чтобы создать JPEG:

File.open("image_name.jpg", 'w') {|f| f.write raw_blob_content } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...