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

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

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

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

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

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

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

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

Благодаря! Даниил

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

Источник: https://stackoverflow.com/a/804089/1438029

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

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