MySQL JSON编码字符串在INSERT..SELECT后损坏

时间:2014-07-20 06:56:39

标签: php mysql json select-insert

我将图像URL的数组编码为json字符串并将它们存储在数据库中。 (utf8_general_ci)。

当我将数据插入表并进行检索时,json_decode()能够对其进行解码。

但是,当我将数据从一个表复制到另一个表(INSERT INTO ... SELECT语句)后,数据从数据库中检索后无法再解码。

相反,我得到了损坏的json ENCoded字符串。即使空数组[]也无法正确解码。

转换自http://pl.tinypic.com/r/fwoiol/8 进入http://pl.tinypic.com/r/bgea05/8

(必须制作图像,因为这些正方形无法复制为文本)。

编辑,在检查了一下后,我尝试从数据库中使用bin2hex()两个字符串。

两者似乎完全相同。

然而,一个解码,一个解码。在

5b22687474703a5c2f5c2f7777772e
changes into
0022687474703a5c2f5c2f7777772e

因此,json_decode仅在字符串中将5b更改为00。

它在某处丢失了编码?

修改2

static public function jsonDecodeFieldsArray($entries, $fields = array('features','images')){
    foreach($entries as $key => $entry){
        $entries[$key] = self::jsonDecodeFields($entry, $fields);
    }
    return $entries;
}
static public function jsonDecodeFields($entry, $fields = array('features','images')){
    foreach($fields as $field){
        if(isset($entry[$field])){
            $entry[$field] = json_decode((string) $entry[$field], true);
        }
    }
    return $entry;
}

我使用上面的代码来解码$ fields指定的数组的键。但是,它不仅错误地解码。但也会影响$ fields中未列出的键。腐蚀他们的编码。

更多要添加。如果我不使用这些函数并且只在字段json_decode($array[0][images], true)上使用json_decode,那么它可以正常工作。

2 个答案:

答案 0 :(得分:1)

澄清我找到答案/解决方案我写了这个答案

原因behoind这个错误不是SQL错误,数据是正确的。我有一个示例数组:

$many_entries = array(
    array(
        'features' = > 'json_encoded_string'
        'images' = > 'json_encoded_string'
    ),
    array(
        'features' = > 'json_encoded_string'
        'images' = > 'json_encoded_string'
    )

);
// And 
$one_entry = array(
    'features' = > 'json_encoded_string'
    'images' = > 'json_encoded_string'
);

现在我有2个功能。一个用于解析$many_entriesjsonDecodeFieldsArray)数组,另一个用于解析$one_entry数组结构(jsonDecodeFields)。

问题是我在jsonDecodeFieldsArray上使用了$one_entry,这使得jsonDecodeFields对字符串进行了迭代。

答案 1 :(得分:0)

通过传输改变字符编码很奇怪。我会说用PHP检查你的字符集,但你说问题只发生在一个表=>表SQL传输。我仍然会检查列/表的字符集。

您可以通过在解码时运行str_replace()来解决此问题。例如:

$DB_ARRAY = $DB_QUERY->fetch_array();
$CORRECT_ENCODING = json_decode(str_replace('0x93', '[', $DB_ARRAY['urlstring']), true);

当然,您需要知道错误编码的字符是什么。或者它的ASCII码等价。