Дополнительная обратная косая черта при выборе ... в OUTFILE ... в MySQL
поэтому я пытаюсь экспортировать таблицу MySQL в CSV. Я использую этот запрос:
SELECT * FROM business WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "n";
это выводит что-то вроде этого:
http://postimage.org/image/2ghyenh5w/full/
проблема в том, что всегда есть дополнительная обратная косая черта где есть новая строка, например, в поле адреса.
однако, CSV экспортируемых от phpmyadmin нет это:
http://postimage.org/image/2gi026tno/full/
любой способ сделать выбор ... OUTFILE ... сделать то же самое?
таблица, с которой я имею дело, имеет 20 миллионов записей, phpMyAdmin может обрабатывать только около 500 000 записей для каждого действия экспорта - или он будет пустым или сервер mysql исчезнет и т. д.
6 ответов
попробуйте это:
SELECT * FROM business WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"
fields terminated by ',' OPTIONALLY ENCLOSED BY '"' escaped by '"'
LINES TERMINATED BY '\n';
Я думаю, проблема в том, что MySQL пытается избежать новой строки ('\n') в ваших текстовых полях, потому что это ваш Терминатор строки.
поля, экранированные элементами управления, как писать специальные символы. Если поля, экранированные символом, не пусты, он используется в качестве префикса, который предшествует следующим символам на выходе:
поля, экранированные символом
поля [опционально] приложен характер
первый символ полей, завершенных и строк, завершенных значениями
ASCII NUL (байт с нулевым значением; то, что на самом деле написано после escape-символа,-это ASCII "0", а не байт с нулевым значением)
(в MySQL)
Я действительно не понимаю, почему он делает то, что он делает в вашем случае, но я смог получить что-то подобное на моем Mac, и запрос выше, казалось, исправил вывод в мой случай.
надеюсь, что это поможет!
похоже, что экспорт MySql не может правильно экспортировать как новые строки, так и кавычки.
при экспорте MySql автоматически избегает обоих
- разделители полей и
- линии разделители
по умолчанию escape-символ представляет собой обратную косую черту. Вы можете переопределить это, добавив СБЕЖАЛ ОТ " на ваш запрос.
к сожалению, в" нормальном " (Excel-совместимом) CSV-файле вы, вероятно, нужны разные кодировки для новых строк и кавычек. В частности, вы хотите, чтобы новые строки были без эскапады,а кавычки удваивались.
например. Если значение содержит новую строку, например:
это строка 1
и это "строка 2", которая содержит кавычки
Он должен стать
"это строка 1
и это ""линия 2"", которая содержит цитаты"
решение Я нашел, чтобы предварительно избежать кавычек и добавить СБЕЖАЛ ОТ " (пустая строка) для моего запроса.
выберите заменить(field1, '"', '""'),
Заменить(field2, '"', '""'),
...
ОТ...
ГДЕ...
В OUTFILE ' / someFile.csv'
ПОЛЯ ЗАВЕРШАЕТСЯ ',' ДОПОЛНИТЕЛЬНО ОБНЕСЕНА '"' СБЕЖАЛ "
Строки, заканчивающиеся на '\n'
У меня была та же проблема, и я узнал (после импорта файла csv в электронную таблицу), что в некоторых полях varchar в таблице MySQL были разрывы строк. После удаления разрывов строк, экспорт работал правильно.
попробуйте это:
SELECT * FROM business WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\'
LINES TERMINATED BY '\n';
Я понял, с помощью escaped by '\'
makes удаляет обратную косую черту экспортированных результатов.
получил ответ здесь https://bugs.mysql.com/bug.php?id=46434
основные моменты:
1. INTO OUTFILE предназначен для получения результатов, готовых к загрузке по данным загрузки
2. По умолчанию ESCAPED by is'\'
3. Чтобы отключить escaping, используйте ESCAPED BY"
я решил это задание \r\n
как Терминатор линии, а не \n
:
SELECT * FROM business WHERE id > 0 AND id <= 20000
INTO OUTFILE "business.csv"
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\'
LINES TERMINATED BY '\r\n';
каждая строка теперь разделена \r\n
, но любые новые строки внутри ваших данных будут оставлены без эскапады-при условии, что присутствующие в них разделители строк все \n
, а не \r\n
.
Удивительно, но это отлично работало на Linux для моих целей-импорт с помощью Лига\Csv (PHP). Я предполагаю, что все программное обеспечение будет импортировать автоматически CSVs должен быть достаточно умен, чтобы различать \n
и \r\n
для переноса строки.