Дополнительная обратная косая черта\когда SELECT... INTO 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/

Любой способ сделать SELECT... OUTFILE... сделать то же самое?

В таблице, в которой я имею дело, содержится 20 миллионов записей, phpMyAdmin может обрабатывать около 500 000 записей для каждого действия по экспорту - или он исчезнет, ​​или сервер mysql исчезнет и т.д.

Ответ 1

Попробуйте следующее:

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') в ваших текстовых полях, потому что это ваш терминатор строк.

FIELDS ESCAPED BY управляет тем, как писать специальные символы. Если символ FIELDS ESCAPED BY не пуст, он используется как префикс, который предшествует следующим символам на выходе:

Символ FIELDS ESCAPED BY

Обозначение FIELDS [OPTIONALLY] ENCLOSED BY

Первый символ ПРОВЕРЕННЫХ ПОЛЕЙ И ЛИНИЙ, ПРЕКРАЩЕННЫХ значениями

ASCII NUL (нуль-значный байт, то, что на самом деле записывается после escape-символа, является ASCII "0", а не нулевым байтом)

(MySQL)

Я действительно не понимаю, почему он делает то, что он делает в вашем случае, но я смог получить что-то подобное на своем Mac, и указанный выше запрос, похоже, исправить выход в моем случае.

Надеюсь, что это поможет!

Ответ 2

Похоже, что для экспорта MySQL невозможно правильно экспортировать и переводы строк и кавычки.

При экспорте MySQL автоматически экранирует оба

  • Разделители полей и
  • Разделители строк

По умолчанию escape-символ является обратной косой чертой. Вы можете переопределить это, добавив ESCAPED BY '' к вашему запросу.

К сожалению, в "нормальном" (совместимом с Excel) CSV файле вам, вероятно, нужны разные кодировки для перевода строки и кавычек. В частности, вы хотите, чтобы переводы строк были не экранированы, а кавычки дублировались.

Например, если значение содержит символ новой строки, например:

Это строка 1
И это "Строка 2", которая содержит кавычки

это должно стать

"Это строка 1
И это "" Строка 2 "", которая содержит кавычки "

Решением, которое я нашел, было предварительное экранирование кавычек и добавление ESCAPED BY '' (пустая строка) в мой запрос.

SELECT REPLACE(field1, '"', '""'),  
REPLACE(field2, '"', '""'),  
...  
FROM ...  
WHERE ...  
INTO OUTFILE '/someFile.csv'  
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY ''  
LINES TERMINATED BY '\n'

Ответ 3

У меня была такая же проблема, и я узнал (после импорта файла csv в электронную таблицу), что в некоторых полях varchar в таблице MySQL были разрывы строк. После удаления разрывов строк экспорт работал правильно.

Ответ 4

Попробуйте следующее:

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 '\' позволяет удалить обратную косую черту при экспортированных результатах.

Ответ 5

Получил ответ здесь https://bugs.mysql.com/bug.php?id=46434

Основные моменты:
1. INTO OUTFILE предназначен для получения результатов, готовых загрузить LOAD DATA
2. По умолчанию ESCAPED BY является "\"
3. Чтобы отключить экранирование, используйте ESCAPED BY ''

Ответ 6

Я решил это, указав \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 для моих целей - импортирование с использованием League\Csv (PHP). Я предполагаю, что любое программное обеспечение будет импортировать ваши сгенерированные CSV, должно быть достаточно умным, чтобы различать \n и \r\n для разрывов строк.

Ответ 7

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';

Во-первых, не ставьте '"" как escape, это изменит ваш контент.

Во-вторых, если вы используете этот запрос ниже, вам нужно также удалить дополнительную строку добавления '\n' с несколькими строками.

mysql -e "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';"