PHP 函数反序列化在字符集更改后停止工作(从 latin1 到 UTF-8)

PHP function unserialize stop working after charset change (from latin1 to UTF-8)

我用PHP函数serialize序列化了一个大字符串的对象,字符串中有一个特殊字符“—”。当数据库使用 latin1 字符集时该对象已保存,现在我将数据库迁移到 UTF-8。

我使用 PHP 函数反序列化来取回对象,因为我将字符集更改为 UTF-8,该函数停止工作。不知道为什么。

我修改httpd.conf使用:

AddCharset UTF-8 .utf8
AddDefaultCharset UTF-8

php.ini:

default_charset = "UTF-8"

并将所有 MySQL 数据转换为 UTF-8。

更新 我在调用反序列化函数时遇到 php 错误:

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

现在,请SHOW CREATE TABLE ...并显示结果。

如果您将 E28094 存储到的列的字符集是 latin1,那么您会一团糟。它需要转换为十六进制 97,即 EM-dash 的 latin1 编码,但事实并非如此。可能你有 utf8 字节,但(默认情况下)告诉 MySQL 你有 utf8 字节。它可能读作“—”——每个字节的 latin1 解码。这是因为 MySQL 将其视为 3 个 latin1 字符。 Here is the likely solution. 但是,要小心。

如果列的字符集是 utf8,那么 table 中的一切都很好。

像这样的问题的长篇大论在my blog.

我发现从latin1改成UTF-8后,序列化后的字符串长度不对。 我用 PHP:

解决了这个问题
$content = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $content);

我要用新字符串更新数据库。