Я использую PHP-функцию serialize для сериализации объекта с большой строкой, в строке которой есть специальный символ «-». Этот объект был сохранен, когда БД использовала кодировку latin1, теперь я перенастраиваю БД в UTF-8.
Я использую функцию PHP unserialize, чтобы вернуть объект, так как я изменил кодировку на UTF-8, чтобы эта функция перестала работать. Я не знаю почему.
Я изменяю httpd.conf для использования:
AddCharset UTF-8 .utf8
AddDefaultCharset UTF-8
php.ini:
default_charset = "UTF-8"
И конвертировать все данные MySQL в UTF-8.
ОБНОВИТЬ
Я улавливаю ошибку php при вызове функции unserialize:
unserialize(): Error at offset 19146 of 23672 bytes in /xxx/xxx.php:18
Теперь, пожалуйста, сделайте SHOW CREATE TABLE ...
и покажи результаты.
Если набор символов для столбца, в который вы сохранили E28094, был латиницей1, значит, у вас беспорядок. Его нужно было преобразовать в hex 97, кодировку latin1 для EM-dash, но не было. Возможно, у вас было utf8 байт, но (по умолчанию) сказал MySQL, что у вас utf8 байт. Он может читаться как «…» — латинское 1 декодирование каждого байта. Это потому, что MySQL считает, что это 3 латинских символа. Здесь скорее всего решение. Но будьте осторожны.
Если CHARACTER SET столбца был utf8, то все хорошо в таблице.
Давнее обсуждение таких проблем происходит в мой блог .
Я обнаружил, что длина сериализованной строки была неправильной после изменения с latin1 на UTF-8.
Я исправляю проблему, используя этот PHP:
$content = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $content);
Я собираюсь обновить базу данных с новой строкой.