MySQL:查询中的回车换行符

9

我有一个查询,可以将每行的两列数据导出到一个文件中。在文件中,每一列的数据都应该用回车符分隔,就像这样:

第一行第一列
第一行第二列
第二行第一列
第二行第二列
第三行第一列
第三行第二列

我尝试使用char(13):

SELECT CONCAT(column1, char(13), column2) FROM my_table INTO outfile 'my_file'

输出文件看起来完全正常(每列数据都在另一行),但当我将其用作应接受所描述格式的程序的输入时,它无法识别。然而,当我手动删除文件中的所有回车符并通过按“enter”键再次添加它们时,我的程序可以毫无问题地识别该文件。 当我尝试使用char(13)、char(10)时,我的输出文件看起来像这样: row1column1
\
row1column2
row2column1
\
row2column1 我确定我错过了一些显而易见的东西 :)

文件输出的格式是什么,CSV文件吗? - Haim Evgi
4个回答

8

我在mysql网站上看到了这个,希望能对您有所帮助。

您应该使用以下语法来创建符合Microsoft Excel预期格式的CSV文件:

... INTO OUTFILE '/temp.csv' FIELDS ESCAPED BY '""' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

然而,带有回车的字段可能会破坏CSV文件,因为当MySQL发现\r\n换行符时,它将自动关闭字段。为了解决这个问题,请将所有\r\n换行符替换为\n。您可以在同一条SQL语句中执行此操作,例如:

SELECT REPLACE(field_with_line_breaks, '\r\n', '\n') FROM table INTO OUTFILE '/temp.csv' FIELDS ESCAPED BY '""' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

我还发现null值也可能会破坏CSV文件。可以用类似的方法处理这些问题:

SELECT IFNULL(possible_null_field, "") FROM table INTO OUTFILE '/temp.csv' FIELDS ESCAPED BY '""' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

注意:这将NULL值替换为空字符串,虽然它们不是完全相同的东西,但它将在Excel中给您一个空单元格,而不是破坏CSV结构并将下面的单元格向左移动。


7
海姆·埃夫吉的回答是正确的,但是:
SELECT REPLACE(field_with_line_breaks, '\r\n', '\n') FROM table INTO OUTFILE '/temp.csv' FIELDS ESCAPED BY '""' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

我不得不更改为:

SELECT REPLACE(field_with_line_breaks, '\r\n', '\n') FROM table INTO OUTFILE '/temp.csv' FIELDS ESCAPED BY '"' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

在 FIELDS ESCAPED BY 中有一个双引号,这导致 mysql 出现错误:"Error 1083: Field separator argument is not what is expected; check the manual"。

将其更改为单引号可以停止错误并导出文件。然后,我成功地将其导入到 Excel 中,并正确格式化了换行符。


我认为你应该只是编辑Haim Evgi的答案。我已经这样做了,但它还没有被批准。 - Tyler Collier

4
尝试使用char(10) - 即"\n" - UNIX的方式。
只是char(13) "\r"是(旧)Mac的方式,而"\r\n"是Windows的方式,但我怀疑MySQL只是为每一行使用\n,因此您需要匹配它。

这只是在两列之间放置“\”。 - Daniel
请注意,为了使查询在CLI(mysql -Ne)上工作,我不得不使用-r Write fields without conversion。与--batch一起使用。希望对您有所帮助,丹。 - Dan Bolser

2

您可能遇到操作系统之间换行符解释不同的问题。

如果您的MySQL数据库在Unix / Linux上,并且将在Unix上读取文件,或者数据库在Windows上并将在Windows上读取,则可以尝试以下方法:

select * into outfile 'my_file'
fields terminated by '\n' lines terminated by '\n'
from my_table;

如果你的MySQL数据库运行在Unix/Linux系统上,而需要在Windows系统上读取文件,则可以尝试以下方法:

select * into outfile 'my_file'
fields terminated by '\r\n' lines terminated by '\r\n'
from my_table;

您也可以使用一个名为dos2unix和unix2dos的小型命令行实用程序在“CRLF”(Windows)和“LF”(Unix)换行符之间转换文件,该实用程序包含在大多数Linux发行版中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接