2016-12-28 1 views
1

У меня есть массив объектов PHP, которые были сериализованы и сохранены в поле mySQL Blob. Я преобразовал базу данных mySQL в postgreSQL, а в postgres это поле находится в формате ByteA. Я читаю поле с Postgres, используя этот код:Как декодировать это значение ByteA для строкового формата?

SELECT "folderName", "jobInfo" 
FROM "jobs" 
ORDER BY "folderName" ASC 

В MYSQL, что данные пришли в виде строки, которая может быть десериализации. Однако, когда я прочитал данные из Postgres, он приходит в таком виде:

\ x613a31353a7b733a31373a2266696c65466f726d617456657273696f6e223b733a333a22342e30223b733a373a226a6f62 [.....]

Есть ли способ, в PHP или Postgres, декодировать это обратно в сериализованную строку текстовых символов?

UPDATE По желанию, вот код, используемый для первоначального создания поля MySql Blob:

 $theJobInfo = serialize($theJobInfo); 

     And SQL query: 

     UPDATE `jobs` SET `jobInfo` = theJobInfo 
WHERE `folderName` = 'myFolderName' 
+0

Если это поле bytea представляет собой объект PHP, как вы знаете, это будет иметь смысл в виде строки символов? –

+0

Показать код, который вы используете, чтобы установить поле в mysql/php изначально. –

+0

Потому что это сериализован. Я сохранял и извлекал эти данные тысячи раз из mySQL, поэтому по этой причине я считаю, что это имеет смысл как строка символов. Я обновил исходное сообщение с кодом PHP/SQL в соответствии с вашим запросом. – VikR

ответ

0

Этот код извлекается сериализованную строку из содержимого поля Postgres BYTEA:

$serializedString = pg_unescape_bytea($contentsOfPostGresByteAField);

Благодаря Sergey Pashkov для наконечника!

0

Вы можете легко конвертировать и из bytea и text, как этот

SELECT convert_from('foo'::bytea, 'UTF8'); 

Однако, я не думаю, что это важно.

Вы используете serailize() function of php

Обратите внимание, что это бинарная строка, которая может включать в себя нулевые байты, и должна храниться и транспортироваться как таковой. Например, вывод serialize() обычно должен храниться в поле BLOB в базе данных, а не в поле CHAR или TEXT.

Эта функция возвращает двоичные данные. Аналогично, unserialize()ожидает двоичные данные. Если вы не хотите использовать двоичные данные в PHP, вы можете сделать jobs.jobinfo в jsonb тип и отправить результат json_encode() к нему, а затем json_decode() из него ..

+0

I * do * хочу использовать двоичные данные.Вот почему я сохраняю его в поле Blob в mySQL. – VikR

+0

Вопрос в том, как только я получу его в поле ByteA postgres, как я могу получить его как сериализованную строку, которую я могу затем выполнить без арифметики? – VikR

+0

Вы не извлекаете его как текстовую строку. Вы получаете его как «двоичную строку» или «скаляр», если php не был тупым. Затем вы загружаете скаляр (с его двоичным содержимым) в 'unserialize()'. –