Дополнительная обратная косая черта при выборе ... в 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 для переноса строки.