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'
我的问题是关于查询的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值的每个列进行操作,因此如果可以的话,这是我想要避免的解决方案
谢谢!
我能够成功地将 MySQL 查询结果保存为 CSV 并将它们导入 Excel,如下所示:
使用表格...
IFNULL(ColumnA, "" ) AS "Column A",
...对于 SELECT 语句中的每个列或表达式,可能会返回 NULL (\N)。这将确保 CSV 文件中的 NULL 值显示为正确引用的空字符串,而不是错误引用的 \N。您可以指定一个值来表示 NULL,而不是空字符串,例如..
    IFNULL(ColumnA, "~NULL~" ) AS "Column A",
IFNULL(ColumnA, "" ) AS "Column A",
请注意 ESCAPED BY 指定一个双引号,ENCLOSED BY 也是如此。我还没有测试 OPTIONALLY ENCLOSED BY 是否会成功,所以我只是 OPTIONALLY。
根据 CSV 规范 - RFC 4180,第 2.7 节,需要使用双引号来转义引用字段值中的另一个双引号。
尝试使用coalesce函数将可以的列转换null为""
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce