簡體   English   中英

MySQL JSON編碼字符串在INSERT..SELECT后損壞

[英]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_entriesjsonDecodeFieldsArray )數組,一個解析$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM