我正在尝试使用以下命令将csv文件加载到我的数据库中:
LOAD DATA INFILE '".$file."'
IGNORE
INTO TABLE ".$table."
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
文件在文本编辑器中显示如下:
header1 header2 header3 header4 header5 header6 header7
column1 column2 column3 column4 column5 column7
column1 column2 column3 colum\n4 column5 column7 <-- notice that sneaky \n in colum\n4
column1 column2 column3 column4 column5 column7
每行都使用\n
终止,因为它是unix格式。我正在使用PHP调用LOAD DATA INFILE
。
现在,当插入数据库时,函数失败,因为\n
中的colum\n4
被视为新行分隔符。
我该怎么办?这是我正在处理的遗留应用程序,所以我正在寻找最简单的修改来使其工作。
\n
中的colum\n4
,因为它是其中的一部分
这个词(例如:Order \not shipped\ yet
)。该文件已发送给我们
像这样。答案 0 :(得分:1)
如果您没有指定
FIELDS
或LINES
子句,则默认值与您编写的相同:FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY ''
(反斜杠是SQL语句中字符串中的MySQL转义字符,因此要指定文字反斜杠,必须为该值指定两个反斜杠,以将其解释为单个反斜杠。转义序列
'\t'
和{{ 1}}分别指定制表符和换行符。)换句话说,默认值会导致
LOAD DATA INFILE
在读取输入时执行以下操作:[ deletia ]
- 将转义字符“
'\n'
”前面的字符解释为转义序列。例如,“\
”,“\t
”和“\n
”分别表示制表符,换行符和反斜杠。有关转义序列的完整列表,请参阅稍后\\
的讨论。[ deletia ]
FIELDS ESCAPED BY
控制如何读取或写入特殊字符:
对于输入,如果
FIELDS ESCAPED BY
字符不为空,则删除该字符的出现,并将以下字符作为字段值的一部分。[ deletia ]如果
FIELDS ESCAPED BY
字符为空,则不会发生转义序列解释。
因此,要停止MySQL将反斜杠FIELDS ESCAPED BY
解释为导入文件中的转义字符,请使用\
的{{1}}子句指定非默认转义字符。如果文件没有转义任何输入字符,则只需指定空字符串:
LOAD DATA INFILE