14

在包含空值和需要双引号转义的列(即,包含'"'字符的列)的结果集上使用 MySQL 的 SELECT ... OUTFILE 时遇到了一些困难。这是我正在使用的 outfile 语法:

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

我的问题与查询的 FIELDS ESCAPED BY 部分有关-如果省略此部分,则空值将正确导出(...,“\ N”,...是 csv 中的样子)。

但是,包含双引号的列将在 excel 中拆分为多行/多列。这是因为 excel 要求通过将列中的 '"' 字符写为 '""' 来进行转义。

包含 FIELDS ESCAPED BY 子句修复了包含双引号字符的列的 excel 问题,但是,它破坏了 NULL 列。NULL 列导出为 ( ..."N,... ) 缺少列上的反斜杠和尾随引号。在 excel 中,由于缺少右引号,这会导致多列相互折叠。

我的目标是能够导出包含双引号和换行符的列,以及将空列导出为 \N,但是我似乎不知道该怎么做。MySQL 文档指出 FIELDS ESCAPED BY 会影响 NULL 列的输出方式,但我无法弄清楚 '""' 的转义序列如何导致在 NULL 列上删除反斜杠和尾随引号

目前,我的解决方案是在将每行输出给用户时执行字符串替换,方法是使用 FIELDS ESCAPED BY 并将 '"N,' 替换为 '"\N",'。这似乎可行,但它没有感觉不对,我担心它会导致一些问题

选择列上的 IFNULL( ) 可能是一个选项,但我们在代码中使用它的方式实际上很难实现。还需要对可能具有 NULL 值的每一列执行此操作,因此如果可以的话,这是我想避免的解决方案

谢谢!

4

2 回答 2

5

我能够成功地将 MySQL 查询结果保存为 CSV 并将它们导入 Excel,如下所示:

  1. 使用表格...

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

...对于 SELECT 语句中的每个列或表达式,都可能返回 NULL (\N)。这将确保 CSV 文件中的 NULL 值显示为正确引用的空字符串,而不是错误引用的 \N。您可以指定一个值来表示 NULL,而不是空字符串,例如..

    IFNULL(ColumnA, "~NULL~" ) AS "Column A",
  1. 使用以下 OUTFILE 选项:

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

请注意,ESCAPEED BY 指定一个双引号,ENCLOSED BY 也是如此。我还没有测试 OPTIONALLY ENCLOSED BY 是否会成功,所以我只是将 OPTIONALLY 排除在外。

根据 CSV 规范 - RFC 4180,第 2.7 节,需要使用双引号来转义带引号的字段值中的另一个双引号。

于 2015-11-09T21:20:50.760 回答
1

尝试使用coalesce函数将可以是的列转换null"" http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

于 2011-01-04T10:28:27.533 回答