Мы храним файлы отчетов в таблице базы данных mysql. Наша текущая реализация выглядит примерно так:
// File was generated and placed on the disk, now we're going
// to store it in the database
$file = file_get_contents($path);
$report->csv_data = $file;
$report->save(); // UPDATE reports SET csv_data = ... WHERE id = ?
Что ж, это приводит к ошибкам из-за нехватки памяти при больших отчетах в несколько сотен мегабайт. Я пытался использовать PDO :: PARAM_LOB, но это не работает, он загружает весь файл в память.
Так что я пытался использовать mysql LOAD DATA INFILE для вставки файла, но это обычно используется для анализа и массового импорта данных. Я не хочу анализировать данные отчета, мне просто нужно, чтобы все содержимое файла было помещено в один столбец в одной строке таблицы. Это то, с чем я возился:
LOAD DATA INFILE '/web/reportTest.csv'
INTO TABLE report.reports
FIELDS TERMINATED BY '?'
LINES TERMINATED BY '?'
(csv_data)
Я пытаюсь установить разделители для некоторого символа, который никогда не будет в результирующем наборе, и только заполнить столбец csv_data, который вроде работает, но кажется хакерским и запускает автоинкремент с ошибкой строк. Я просто не могу найти других примеров того, как люди делают это, поэтому любая помощь будет принята с благодарностью. Кроме того, если кто-то знает о лучшем способе выполнения sh этого, я весь слух.
РЕДАКТИРОВАТЬ: Моя таблица выглядит следующим образом:
CREATE TABLE `report` (
`id` INT(10) NOT NULL,
`date` INT(10) NOT NULL,
`uindex` INT(11) NOT NULL,
`csv_filename` VARCHAR(255) NULL DEFAULT NULL COLLATE 'latin1_general_ci',
`csv_data` LONGTEXT NULL DEFAULT NULL COLLATE 'latin1_general_ci',
`delivery_schedule` TINYINT(2) NOT NULL,
`saved_id` INT(11) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `saved_id` (`saved_id`) USING BTREE,
INDEX `date_idx` (`date`) USING BTREE
)
COLLATE='latin1_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=678526
;