Как я обращаюсь со значениями NULL в операторе SELECT ... OUTFILE mysql вместе с FIELDS ESCAPED BY?Значения NULL в настоящее время усекаются - PullRequest
11 голосов
/ 04 января 2011

Я сталкиваюсь с некоторыми трудностями при использовании MySQL SELECT ... OUTFILE для наборов результатов, которые включают в себя как нулевые значения, так и столбцы, для которых требуется экранирование двойных кавычек (т. Е. Столбцы, содержащие символы "").используя:

INTO OUTFILE '$csv_file' 
FIELDS ESCAPED BY '""' TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n'

Моя проблема связана с частью запроса FIELDS ESCAPED BY - если эта часть пропущена, то нулевые значения будут экспортироваться правильно (..., "\ N", ... isкак это выглядит в csv).

Однако столбцы, содержащие двойные кавычки, будут разбиты на несколько строк / столбцов в Excel. Это связано с тем, что Excel требует, чтобы символы "" "внутри столбцов были экранированы путем записиих как "" ".

Включение предложения FIELDS ESCAPED BY устраняет проблему Excel со столбцами, содержащими символы двойной кавычки, однако разбивает столбцы NULL.Столбцы NULL экспортируются как (... "N, ...) без обратной косой черты и конечной кавычки в столбце. В Excel это приводит к тому, что несколько столбцов сворачиваются друг в друга из-за отсутствия закрывающей кавычки.

Моя цель - иметь возможность экспортировать столбцы, содержащие двойные кавычки и символы новой строки, а также экспортировать пустые столбцы как \ N, однако я не могу понять, как это сделать. Документы MySQL утверждают, чтоFIELDS ESCAPED BY влияет на способ вывода столбцов NULL, но я не могу понять, как escape-последовательность "" "приводит к удалению обратной косой черты и завершающей кавычки в столбце NULL

В настоящее время мое решениечтобы выполнить замену строки в каждой строке при выводе ее пользователю, используя FIELDS ESCAPED BY и заменяя «N» на «\ N», '.Кажется, это работает, но это не правильно, и я боюсь, что это вызовет какие-то проблемы в дальнейшем

IFNULL () в столбцах выбора - это вариант, но способ, которым мыиспользовать это в нашем коде, на самом деле довольно сложно реализовать.Это также необходимо сделать для каждого столбца, который потенциально может иметь значения NULL, поэтому я бы хотел избежать такого решения, если смогу

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 ноября 2015

Мне удалось успешно сохранить результаты запросов MySQL в формате CSV и импортировать их в Excel следующим образом:

  1. Использовать форму ...

    IFNULL(ColumnA, "" ) AS "Column A",
    

... для каждого столбца или выражения в вашем операторе SELECT, которые могут вернуть NULL (\ N).Это гарантирует, что значения NULL в вашем CSV-файле будут отображаться как правильно заключенные в кавычки пустые строки, а не как неправильно заключенные в кавычки \ N's.Вместо пустой строки вы можете указать значение для представления значения NULL, например ..

    IFNULL(ColumnA, "~NULL~" ) AS "Column A",
Используйте следующие опции OUTFILE:

FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'

Обратите внимание, что ESCAPED BY определяет одну двойную кавычку, как и ENCLOSED BY.Я не проверял, будет ли OPTIONALLY ENCLOSED BY успешным, поэтому я просто опускаю OPTIONALLY.

Использование двойной кавычки для выхода из другой двойной кавычки в значении поля в кавычках требуется в спецификации CSV - RFC4180, раздел 2.7.

1 голос
/ 04 января 2011

Попробуйте использовать функцию coalesce для преобразования столбца, который может быть null в "" http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

...