PHP函数unserialize在charset更改后停止工作(从latin1到UTF-8)

时间:2015-04-01 17:33:43

标签: php mysql serialization utf-8 latin1

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

我使用PHP函数unserialize来获取对象,因为我将charset更改为UTF-8,该函数停止工作。我不知道为什么。

我修改httpd.conf使用:

AddCharset UTF-8 .utf8
AddDefaultCharset UTF-8

的php.ini:

default_charset = "UTF-8"

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

更新 我在调用unserialize函数时遇到了php错误:

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

2 个答案:

答案 0 :(得分:1)

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

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

如果列的CHARACTER SET是utf8,则表中的所有内容都很好。

对这类问题的冗长讨论是在my blog

答案 1 :(得分:0)

我发现从latin1更改为UTF-8后序列化字符串的长度错误。 我用这个PHP解决了这个问题:

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

我将使用新字符串更新数据库。