В таблице ?_topic_content в поле topic_extra хранятся сериализованные (упакованные) данные. Если при записи/чтении текст обрезался, то данные корректно распаковаться не могут и возникает такая ошибка.
Проблема может быть, как ни странно, в Юникоде. По умолчанию используется кодировка MySQL utf8_general_ci. Но она не поддерживает полноценный Юникод. Если в записываемых данных есть символы, которые в UTF-8 кодируюися четыремя байтами (например, символы-эмотиконы, emoji), то при кодировке utf8_general_ci записываемая строка будет обрезаться. Соответственно, при чтении она получается урезанной и не может быть корректно распакована.
Если проблема в этом, то решение:
1) Убедиться, что используется MySQL версии 5.5.3 или выше
2) Преобразовать в таблице ?_topic_content поле topic_extra в кодировку utf8mb4_unicide_ci
3) В app/config/config.local.php добавить строку
$config['db']['params']['charset'] = 'utf8mb4';
Чего я не знаю наверняка: можно ли оставить кодировку базы в целом и таблицы в целом utf8_general_ci, а только одно конкретное поле задать в utf8mb4_unicide_ci, или обязательно нужно таблице и/или базе тоже задавать эту кодировку.
Но после этой манипуляции данные нужно еще раз перенести из старой базы, т.к. в таблице они уже записаны «криво». Можно вручную перенести только таблицу ?_topic_content.
И одно замечание: данные в кодировке utf8mb4_unicide_ci занимают в базе (И, соответственно, на диске) больше места.
Проблема может быть, как ни странно, в Юникоде. По умолчанию используется кодировка MySQL utf8_general_ci. Но она не поддерживает полноценный Юникод. Если в записываемых данных есть символы, которые в UTF-8 кодируюися четыремя байтами (например, символы-эмотиконы, emoji), то при кодировке utf8_general_ci записываемая строка будет обрезаться. Соответственно, при чтении она получается урезанной и не может быть корректно распакована.
Если проблема в этом, то решение:
1) Убедиться, что используется MySQL версии 5.5.3 или выше
2) Преобразовать в таблице ?_topic_content поле topic_extra в кодировку utf8mb4_unicide_ci
3) В app/config/config.local.php добавить строку
Чего я не знаю наверняка: можно ли оставить кодировку базы в целом и таблицы в целом utf8_general_ci, а только одно конкретное поле задать в utf8mb4_unicide_ci, или обязательно нужно таблице и/или базе тоже задавать эту кодировку.
Но после этой манипуляции данные нужно еще раз перенести из старой базы, т.к. в таблице они уже записаны «криво». Можно вручную перенести только таблицу ?_topic_content.
И одно замечание: данные в кодировке utf8mb4_unicide_ci занимают в базе (И, соответственно, на диске) больше места.
Вот исходный код плагина, если вдруг интересно:
(может кто-то портирует на Альто?)