1

serialize()输出不必要的垃圾,如字符串长度和其他东西,这是完全没用的。

a:2:{s:10:"SOME VALUE";a:35:{s:36:"VAL1";s:1:"1";s:7: skipped...............

json_encode()更好,但仍然会产生垃圾。

{"SOME VALUE":{"\u041a\u043e\u0434 \u041c\u0435\u0441\u0442\u0430 \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f":"1","\u0415-\u0414\u0422":"0","\u0420\u0435\u0436\u0438\u043c \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438":"0","\u041c\u0430\u0440\u0448\u0440\u0443\u0442":"0","\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439":"0","\u041e\u0442\u0432. \u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b

为什么我需要所有这些东西而不是可读数组?MySQL 字段已设置为utf8_unicode_ci.

结果,我得到了绝对不必要的流量。

我有什么选择而不是手动解析?

代码在这里无关紧要。

4

3 回答 3

4

答案很简短。
不要将序列化的数组存储在数据库中。

即使您认为目前不需要对存储的数据进行任何过滤或关系链接搜索,几天后您就会意识到您需要这样做,但无法区分此 blob 中的最小值。

因此,为数据创建一个常规表并将每个值存储在一个单独的字段中。
您将完全按照您想要的方式获得您的数据 - 健全且安全。

于 2013-03-08T16:04:25.610 回答
1

PHP 4 和 5 没有内置的 Unicode 支持;在这种情况下,我使用这个函数来反序列化数据。序列化功能工作正常。

/**
 * Mulit-byte Unserialize
 *
 * UTF-8 will screw up a serialized string
 *
 * @access private
 * @param string
 * @return string
 */
function mb_unserialize($string) {
    $string = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $string);
    return unserialize($string);
}

来源:http ://dzone.com/snippets/muli-byte-unserialize

于 2013-03-08T16:05:56.567 回答
1

在 php 5.4 中json_encode支持一个额外的选项标志:JSON_UNESCAPED_UNICODE. 您可以按如下方式使用它:

$encoded = json_encode($array,JSON_UNESCAPED_UNICODE);

这不会转义 utf8 序列(\u041a等)。

http://php.net/manual/en/function.json-encode.php

这当然要求您使用 PHP 版本 >= 5.4。

请注意:作为一般规则,将序列化数据存储在数据库中被认为是不好的做法

于 2013-03-08T16:09:16.000 回答