MySQL JSON Закодированная строка повреждена после INSERT..SELECT

Я кодирую массив Image URLS в строку 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

(пришлось делать изображения, так как эти квадраты не могут быть скопированы как текст).

Edit, после проверки немного больше, я попытался 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. Однако, это не только неправильно декодирует. Но также влияет на ключи, которые не перечислены в полях $. Коррупция их кодировок.

Больше добавить. Если я не использую эти функции и использую только json_decode в полях json_decode($array[0][images], true) это работает отлично.

2 ответа

Решение

Чтобы уточнить, что я нашел ответ / решение, я пишу этот ответ

Причиной этой ошибки была не ошибка 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).

Проблема была я использовал jsonDecodeFieldsArray на $one_entry который сделал jsonDecodeFields итерации по строкам.

Странно, что кодировка символов меняется при передаче. Я бы сказал, проверьте ваши кодировки (ы) в PHP, но вы сказали, что проблема возникает только при передаче SQL table => table. Я бы все равно проверил кодировку столбца / таблицы.

Вы можете решить эту проблему, запустив str_replace() после декодирования. Например:

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

Вам, конечно, нужно знать, что такое неправильно закодированный символ. Или его эквивалент кода ASCII.

Другие вопросы по тегам