2015-04-01 4 views
0

Я использую сериализацию PHP для сериализации объекта с большой строкой, в строке - специальный символ «-». Этот объект был сохранен, когда БД использовала latin1 charset, теперь я переношу db в UTF-8.Функция PHP unserialize перестает работать после изменения набора символов (от 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.

UPDATE Я ловлю ошибку PHP, когда я называю десериализируются функцию:

unserialize(): Error at offset 19146 of 23672 bytes in /xxx/xxx.php:18 
+0

Выполните команду SELECT col, HEX (col) ... ', чтобы показать нам шестерку для непослушного символа. Это поможет решить, являются ли данные неправильными в базе данных или данные обрабатываются некорректно после извлечения из базы данных. –

+0

HEX - E28094, благодаря Рику. – Tony

+0

Похоже, что это символ UTF-8 (http://www.fileformat.info/info/unicode/char/2014/index.htm), поэтому сторона mysql верна, и проблема в apache/php? – Tony

ответ

0

Я обнаружил, что длина сериализованной строки была неправильной после изменения с latin1 на UTF-8. исправить эту проблему с помощью этого PHP:

$content = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $content); 

я собираюсь обновить базу данных с новой строки.

+0

Возможно, было бы лучше использовать json_encode/decode вместо un/serialize? –

1

Теперь, пожалуйста, сделать SHOW CREATE TABLE ... и показать результаты.

Если значение ХАРАКТЕРА УСТАНАВЛИВАЕМОГО столбца, в котором вы сохранили E28094, было latin1, у вас беспорядок. Его нужно было преобразовать в hex 97, кодировку latin1 для EM-тире, но не было. Вероятно, у вас были utf8 байты, но (по умолчанию) сказал MySQL, что у вас есть utf8 байт. Он может читать как «â» »- латинское декодирование каждого байта. Это связано с тем, что MySQL думает об этом как о 3 латинских символах. Here is the likely solution. Но будьте осторожны.

Если CHARACTER SET столбца был utf8, тогда все хорошо в таблице.

Долгосрочное обсуждение таких проблем, как это, находится в my blog.

+0

-The колонка LONGTEXT СОРТ utf8_unicode_ci NOT NULL -Стол является ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci» До этого был latin1 – Tony

+0

Я использую этот запрос для миграции из latin1 в кодировке UTF-8:. ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE

CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;? – Tony

+0

ли EM-тир печать правильно ли HEX еще сказать E28094 –