PHP: json_encode vs serialize для хранения в базе данных MySQL?

Я храню некоторые "неструктурированные" данные (массив с ключом) в одном поле моей таблицы, и я в настоящее время использую serialize()/unserialize() для "преобразования" назад и вперед от массива к строке.

Время от времени, однако, я получаю ошибки при неэтериализации данных. Я считаю, что эти ошибки происходят из-за данных Unicode в строках внутри массива, который я сериализую, хотя есть некоторые записи с данными Unicode, которые работают очень хорошо. (Поле DB - UTF-8)

Мне интересно, будет ли использование json_encode вместо сериализации сделать разницу/сделать это более устойчивым. Для меня это не тривиально, так как в моей среде dev все работает хорошо, но в производстве, время от времени (около 1% записей), я получаю сообщение об ошибке.

Btw, я знаю, что я не знаю, как найти реальное объяснение проблемы, и просто слепо попробовать что-то, я как бы надеюсь, что смогу избавиться от этого, не тратя на это слишком много времени.

Считаете ли вы, что использование json_encode вместо сериализации сделает это более устойчивым к "ошибкам сериализации"? Формат данных выглядит более "прощающим" для меня...

ОБНОВЛЕНИЕ. Фактическая ошибка, которую я получаю:

 Notice: unserialize(): Error at offset 401 of 569 bytes in C:\blah.php on line 20

Спасибо! Daniel

Ответ 1

Обнаружено это в документах PHP...

function mb_unserialize($serial_str) { 
    $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str ); 
    return unserialize($out); 
} 

Я не совсем понимаю это, но он работал, чтобы неэтериализовать данные, которые я раньше не мог выполнить. Теперь, переместившись в JSON, я сообщу через пару недель, разрешила ли это проблема случайного получения некоторых "поврежденных" записей

Ответ 2

JSON имеет одно главное преимущество:

  • совместимость с другими языками, чем PHP.

PHP serialize имеет одно главное преимущество:

  • он специально предназначен для хранения данных на основе PHP - в первую очередь, он может хранить сериализованные объекты, экземпляр классов, которые будут повторно задействованы в правильном типе класса, когда строка неэтериализована.

(Да, эти преимущества являются полностью противоположными друг другу)


В вашем случае, когда вы храните данные, которые не структурированы, оба формата должны работать очень хорошо.

И проблема с кодировкой, которую вы имеете, не должна быть связана с сериализацией сама по себе: до тех пор, пока все (DB, соединение с БД, файлы PHP,...) находится в UTF-8, сериализация также должна работать.

Ответ 3

Люди в FriendFeed выбрали аналогичное решение, используя JSON. Вы должны проверить его сообщение в блоге об этом.

Ответ 4

Если проблема в кодировке UTF-8 (и я считаю, что она есть), между json_encode и serialize нет разницы. Оба будут оставлять символы без изменений.

Вы должны убедиться, что ваша база данных/соединение правильно настроена для дескрипторов символов all UTF-8 или кодирует всю запись в поддерживаемую кодировку перед вставкой в ​​БД.

Также укажите, что означает "Я получаю сообщение об ошибке".

Ответ 5

json_encode() преобразует символы, отличные от ASCII (например, "Schrödinger" становится "Schr\u00f6dinger" ), но serialize() не делает.

Источник: https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make#common-mistake-6--ignoring-unicodeutf-8-issues


Чтобы оставить символы UTF-8 нетронутыми, вы можете использовать опцию JSON_UNESCAPED_UNICODE с PHP 5.4.

Источник: fooobar.com/questions/13879/...

Ответ 6

В качестве конструктивного решения я предпочел бы хранить JSON, потому что он может представлять только структуру данных, тогда как сериализация привязана к сигнатуре объекта данных PHP.

Преимущества, которые я вижу: * вы вынуждены отделять хранилище данных от любого логического уровня сверху. * вы не зависимы от изменений в классе объектов данных (скажем, например, что вы хотите добавить поле).