在MySQL中存储UTF-8 PHP数组而不使用serialize()或json_encode()

时间:2013-03-08 15:57:35

标签: php mysql arrays

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

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

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

代码在这里不重要。

3 个答案:

答案 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);
}

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

答案 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当然。

请注意:作为一般规则,在您的数据库中存储序列化数据被视为不良做法