【发布时间】:2013-10-28 10:37:35
【问题描述】:
在将对象存储到数据库并检索它之后,我在网站上遇到了许多偏移错误。如果我不存储它一切正常:
$serializedObject = serialize($this);
$unSerializedObject = unserialize($serializedObject);
此外,我在保存数据并从数据库中检索数据时使用 base64 编码,但这无济于事。不过,我不做任何逃避。 我的对象处理一些字符串。我发现用这个字符串:
A woman is travelling around the world. She is 28 years old and she is from Great Britain.
She cannot use a car or a plane on her
它工作正常。但是当我再添加一个空格和单词[旅程]时,就会弹出错误。这是带有这个单词的字符串:
A woman is travelling around the world. She is 28 years old and she is from Great Britain.
She cannot use a car or a plane on her journey
我的问题是为什么会弹出错误?
Here 是serialize($this) 对没有单词journey 的文本运行的输出
Here 是serialize($this) 对带有单词journey 的文本运行的输出
更新
我保存对象的表有字符集utf-8 和没有定义字符集的列,因为它是 BLOB 类型。
mb_detect_encoding(serialize($this)) 返回UTF-8
$sql 没有转义。这就是我正在使用的 Kohana 框架中执行查询的方式:
$result = mysql_query($sql, $this->_connection)
【问题讨论】:
-
这个函数只检查简单的可变长度,它不适用于对象的私有/公共属性。
-
@dev-null-dweller,所以如果我的对象具有私有属性,那么您的意思是它显示不正确的数据?
-
@Maximus,您提到您正在使用 Kohana。您是否通过扩展 Kohana_ORM 记录的对象保存它?另外,你能把
echo serialize($this)和echo bin2hex(serialize($this))的内容粘贴进去吗? (通过 pastebin.com 的东西,如果它真的很大的话。) -
@Matthew,不,我正在手动操作
DB::query(Database::INSERT, $sql)->execute();。 Here is 粘贴的序列化对象。 -
@Maximus,是的,UTF8 字符在存储在 blob/文本中时可能需要 2 个或更多字节。 (对于大小以字符为单位的 CHAR/VARCHAR 而言,情况并非如此。好吧,它仍然会消耗这些额外的字节,但这已计入 VARCHAR 的长度中。)
标签: php