MySQL экспорт в CSV с полем BLOB-объектов - PullRequest
1 голос
/ 22 ноября 2011

У меня проблема с экспортом BLOB в CSV-файл с использованием php.Очевидно, что blob не является нормальным полем, но иногда оно используется.Но вот что мне нужно, мне нужно, чтобы этот скрипт работал, беря массив таблиц и экспортируя каждую строку в формате csv.Blob облажался.Я попытался base64_encode для большого двоичного объекта, но я считаю, что это приведет к неправильному экспорту большого двоичного объекта.

Вот что у меня есть:

function exportcsv($tables) {
    foreach ($tables as $k => $v) {
        $fh = fopen('sql/'.$v.'.csv', 'w');
        $sql = mysql_query("SELECT * FROM $v");
        while ($row = mysql_fetch_row($sql)) {
            $line = array();
            foreach ($row as $key => $v) {
                $line[] = base64_encode($v);
            }
            fputcsv($fh, $line, chr(9)); //tab delimiting
        }
        fclose($fh);
    }
}

Любая помощь будет признательна.

РЕДАКТИРОВАТЬ: Вот изображение экспорта BLOB-объектов БЕЗ base64_encode ().https://www.strongspace.com/shared/crypok1lxb

Так будет ли base64 защищать формат BLOB-объектов при необходимости повторного импорта?

1 Ответ

2 голосов
/ 22 ноября 2011

Цель кодирования Base64 состоит в том, чтобы заставить двоичные данные выживать при передаче через транспортные уровни, которые не являются 8-битными, поэтому да, вы на правильном пути с этим.

То, что вам действительно нужнобеспокоит то, что функция fputcsv ().Какие опасные элементы вы должны проверить?

  1. Вкладки, потому что это ваш разделитель
  2. Символы новой строки, потому что кажется, что вы также анализируете по строке

Согласно этой ссылке , кодировка Base 64 охватывает только AZ, az, 0-9, + и /, что означает, что вы в безопасности, и новая строка в отправленном вами изображении, вероятно,артефакт из переноса слов в IDE, который вы используете.Теперь все, что вам нужно запомнить, это то, что когда вы хотите импортировать эти данные обратно в БД, не ожидайте просто использовать mysqldump или mysql <для передачи по конвейеру. Вам нужно будет создать другую функцию php, которая используетbase64_decode для возврата данных в исходное состояние. </p>

Вы также должны знать, что в настоящее время вы кодируете все поля, а не только данные BLOB-объектов.Кодировка Base64 занимает примерно на 33% больше места в качестве FYI, поэтому вы можете определить свои таблицы с некоторым битом, указывающим, является ли поле блудом, и вы хотите включить кодирование B64 для него.

...