所以我试图将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服务器消失等等。
答案 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';"