我使用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
答案 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);
我将使用新字符串更新数据库。