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
。
结果我得到了绝对不必要的流量。
我有什么选择而不是手动解析?
代码在这里不重要。
答案 0 :(得分:4)
答案简短而简单 不要将序列化数组存储在数据库中。
即使您认为此刻不需要搜索存储数据的过滤或关系链接,但在几天内您将意识到您需要它,但无法区分此blob中的最小值。
因此,为数据创建一个常规表并将每个值存储在一个单独的字段中 并且您将以您希望的方式获得您的数据 - 健全且安全。
答案 1 :(得分: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);
}
答案 2 :(得分: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当然。
请注意:作为一般规则,在您的数据库中存储序列化数据被视为不良做法