Я храню некоторые «неструктурированные» данные (массив с ключом) в одном поле моей таблицы, и я в настоящее время использую 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
Благодаря! Даниил
У JSON есть одно главное преимущество:
serialize
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 () этого не делает.
Чтобы оставить символы UTF-8 незатронутыми, вы можете использовать опцию JSON_UNESCAPED_UNICODE с PHP 5.4.
В качестве конструктивного решения я бы выбрал сохранение JSON, поскольку он может представлять только структуру данных, тогда как сериализация привязана к сигнатуре объекта данных PHP.
Я вижу следующие преимущества: * вы вынуждены отделять хранилище данных от любого логического уровня сверху. * вы не зависимы от изменений в классе объектов данных (скажем, например, что вы хотите добавить поле).