![](/img/trans.png)
[英]Strange behaviour in WordPress MySQL insert of JSON encoded data
[英]MySQL JSON Encoded string corrupts after INSERT..SELECT
我将图像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 json_decode($array[0][images], true)
它可以正常工作。
为了澄清我找到了答案/解决方案,我写了这个答案
原因是这个错误不是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_entries
( jsonDecodeFieldsArray
)数组,一个解析$one_entry
数组结构( jsonDecodeFields
)。
问题是我在$one_entry
jsonDecodeFieldsArray
上使用了jsonDecodeFieldsArray
,它使jsonDecodeFields
迭代字符串。
字符编码通过传输而改变是奇怪的。 我会说用PHP检查你的字符集,但是你说这个问题只发生在table => table SQL transfer中。 我仍然会检查列/表的字符集。
您可以通过在解码时运行str_replace()来解决此问题。 例如:
$DB_ARRAY = $DB_QUERY->fetch_array();
$CORRECT_ENCODING = json_decode(str_replace('0x93', '[', $DB_ARRAY['urlstring']), true);
当然,您需要知道错误编码的字符是什么。 或者它的ASCII码等价。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.