如何在mysql SELECT ... OUTFILE语句中与FIELDS ESCAPED BY一起处理NULL值?NULL值当前正被截断

Kev*_*ani 12 php mysql sql into-outfile

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

INTO OUTFILE '$csv_file' 
FIELDS ESCAPED BY '""' TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

目前,我的解决方案是在每行输出一个字符串替换,因为我将它输出给用户,使用FIELDS ESCAPED BY并将'"N"替换为'"\ N",'.这似乎有效,但它没有感觉不错,我担心会引起某种问题

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

谢谢!

Mik*_*ine 5

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

  1. 使用表格...

    IFNULL(ColumnA, "" ) AS "Column A",
    
    Run Code Online (Sandbox Code Playgroud)

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

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

IFNULL(ColumnA, "" ) AS "Column A",
Run Code Online (Sandbox Code Playgroud)

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

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


Ces*_*sar 2

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

  • 感谢您的提示,但不幸的是,这与 IFNULL 具有相同的缺点,因为我必须指定可能具有 NULL 值的每一列。实现方面 IFNULL 和 COALESCE 几乎相同,但我确实想知道哪个在非常大的输出文件导出上具有更好的性能。 (4认同)