【问题标题】:MySQL JSON Encoded string corrupts after INSERT..SELECTMySQL JSON 编码字符串在 INSERT..SELECT 后损坏
【发布时间】:2014-07-20 06:56:39
【问题描述】:

我将图像 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 它工作正常。

【问题讨论】:

  • 将代码示例缩进 4 个空格以获得正确显示括号的代码格式。
  • 我没有提供任何代码示例
  • 这似乎是排序规则冲突的问题。两列的排序规则是否匹配?
  • 确实如此。两者都相同(utf8_general_ci)
  • 我觉得我发现了问题,要做一些测试

标签: php mysql json select-insert


【解决方案1】:

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

出现此错误的原因不是 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,这使得jsonDecodeFields 迭代字符串。

【讨论】:

    【解决方案2】:

    奇怪的是,字符编码在传输过程中发生了变化。我会说检查你在 PHP 中的字符集,但你说问题只发生在表 => 表 SQL 传输中。我仍然会检查列/表的字符集。

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

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

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

    【讨论】:

    • 感谢您的回答。但是问题的最后评论回答了原因。我想我会写一个答案来跳过混乱。我使用函数来解析条目数组以仅解析一个条目。
    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多