当条目具有\ n时修复LOAD DATA INFILE

时间:2013-12-23 12:24:31

标签: php mysql regex escaping newline

我正在尝试使用以下命令将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被视为新行分隔符。

我该怎么办?这是我正在处理的遗留应用程序,所以我正在寻找最简单的修改来使其工作。

更新

  • PS:我不能删除\n中的colum\n4,因为它是其中的一部分 这个词(例如:Order \not shipped\ yet)。该文件已发送给我们 像这样。
  • 该文件由另一家公司发送给我们。我们不能要求他们修改他们生成它的方式。

1 个答案:

答案 0 :(得分:1)

正如LOAD DATA INFILE Syntax所述:

  

如果您没有指定FIELDSLINES子句,则默认值与您编写的相同:

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