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