копирование большого двоичного объекта из mysql в postgres не работает (я больше не вижу изображение)

мне нужно скопировать изображение BLOB-объекта (jpeg) из базы данных mysql в таблицу postgres с полем bytea. я использую c++.. я читаю изображение из mysql таким образом

char* buffer = new char[res2->getInt(1)];
memset(buffer, '\0', res2->getInt(1));
(res->getBlob("att"))->read(buffer,res2->getInt(1));

res2 содержит LENGHT (blob_field). теперь, если я сохраняю буфер в файле, я отлично вижу изображение. после этого я пишу буфер в таблице postgres с помощью

const char* const paramValues[] = {buffer};
const int nParams = sizeof(paramValues) / sizeof(paramValues[0]);
const int paramLenghts[] = {buffer_size };
const int paramFormats[] = {1 }; /*binary */


PQexecParams(
             conn,
             "INSERT INTO images (img) VALUES($1::bytea)",
             nParams,
             NULL, /* Types of parameters, unused as casts will define types */
             paramValues,
             paramLenghts,
             paramFormats,
             0
         );

в таблице postgres у меня есть данные в поле bytea, но если я копирую и вставляю вручную в файл, я не вижу изображения, потому что это не изображение jpeg... строка postgres отличается от строки mysql (если я откройте mysql с помощью текстового редактора), но я не понимаю, почему, так как я сделал простое копирование и вставку .. любой намек ??


person SUPERALEX    schedule 26.06.2013    source источник
comment
строка postgres предположительно является текстовым представлением содержимого bytea. Точно так же, как вы используете C++ для вставки изображения, используйте C++ для его извлечения в файл, а не для копирования/вставки из какого-либо неопределенного инструмента визуализации.   -  person Daniel Vérité    schedule 26.06.2013
comment
Я думал об этой возможности.   -  person SUPERALEX    schedule 26.06.2013
comment
@DanielVérité я пытался читать с помощью С++ и записывать в файл, но изображение повреждено ... и строка внутри - это именно то, что я видел из pgadmin ... плюс длина того, что я прочитал из postgres, намного длиннее, чем то, что у меня есть на mysql: длина файла bytea составляет 19253 байта, исходный размер 6728 байт.   -  person SUPERALEX    schedule 27.06.2013
comment
обновить, я попытался открыть его, используя загрузку java на изображение, и он работает, поэтому в postgres данные верны   -  person SUPERALEX    schedule 27.06.2013


Ответы (1)


Скорее всего, побег является причиной вашей проблемы. Bytea может вернуться в текстовом или двоичном режиме. Если это текстовый режим, вы увидите шестнадцатеричную строку или восьмеричную экранированную строку. В этом случае вам нужно сначала запустить его через PQunescapeBytea.

Если проблема не в этом, то следующим шагом будет проверка того, как вы вставили данные. Возможно, вы вставили его неправильно, и поэтому ваши данные в базе данных повреждены.

person Chris Travers    schedule 27.10.2013