当SELECT ... INTO OUTFILE ...在MySQL时额外的反斜杠\

时间:2011-03-11 01:43:46

标签: mysql sql into-outfile

所以我试图将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/

这个问题是,总有一个额外的反斜杠\,其中有换行符,例如在地址栏中。

但是,从phpMyAdmin导出的CSV没有:

http://postimage.org/image/2gi026tno/full/

任何方式使SELECT ... OUTFILE ...做同样的事情?

我正在处理的表有2000万条记录,phpMyAdmin每次导出操作只能处理大约500,000条记录 - 或者它会变成空白或者mysql服务器消失等等。

7 个答案:

答案 0 :(得分:5)

试试这个:

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字符

     

按字符

包围的字段[OPTIONALLY]      

FIELDS TERMINATED BY和LINES TERMINATED BY值的第一个字符

     

ASCII NUL(零值字节;转义字符后实际写入的内容是ASCII“0”,而不是零值字节)

MySQL

我真的不明白为什么它正在做你正在做的事情,但我能在我的Mac上得到类似的东西,上面的查询似乎在我的情况下修复了输出。

希望有所帮助!

答案 1 :(得分:5)

看起来MySQL导出无法正确导出换行符和行情。

导出时,MySQL会自动转义

  • 字段分隔符,
  • 行分隔符

默认情况下,转义字符是反斜杠。您可以通过在查询中添加ESCAPED BY ''来覆盖此项。

不幸的是,在“普通”(Excel兼容)CSV文件中,您可能需要对换行符和引号进行不同的编码。具体来说,您希望换行符未被转义,引号加倍。

E.g。如果值包含类似的换行符:

  

这是第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'

答案 2 :(得分:1)

我遇到了同样的问题,我发现(在将csv文件导入电子表格后),MySQL表中的某些varchar字段中存在换行符。删除换行符后,导出工作正常。

答案 3 :(得分:0)

试试这个:

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 '\' make会删除导出结果的反斜杠。

答案 4 :(得分:0)

在这里得到答案https://bugs.mysql.com/bug.php?id=46434

要点是:
1. INTO OUTFILE旨在通过LOAD DATA生成准备加载的结果 2.默认情况下,ESCAPED BY是&#39; \&#39;
3.要禁用转义,请使用ESCAPED BY&#39;

答案 5 :(得分:0)

我通过指定\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之间的换行符。

答案 6 :(得分:0)

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

首先,请勿将'""用作转义符,这会更改您的内容。

第二,如果您在下面的cli中使用此查询,则还需要远程添加多行'\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';"