MySQL中的LOAD DATA INFILE与字符串的转义

时间:2014-04-17 12:34:10

标签: mysql csv

将CSV文件加载到MySQL数据库中时出现问题

CSV文件是这样的:

stuID,stuName,degreeProg
6902101,A001,null
6902102,A002,null
6902103,A003,null
6902104,A004,null
6902105,A005,null

我写了一个这样的脚本:

LOAD DATA LOCAL INFILE 'demo.csv' INTO TABLE `table`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(`col1`, `col2`, `col3`)

让我感到困扰的是:

  1. 文件中的第三列是null,但加载到表格后,它变为'null'(字符串)
  2. 在文件的末尾,有一个额外的空行,也会加载并分配null
  3. 我应该如何编写脚本来处理这两个问题? (禁止修改csv文件)(最好在运行此脚本时尝试减少MySQL的警告)

2 个答案:

答案 0 :(得分:1)

1)一个选项是让LOAD DATA分配第三个字段的值(即字符串'null') into a user defined variable, and use the" SET col = expr" form to assign a value to the column col3`

举个例子:

    (`col1`, `col2`, @field3)
    SET col3 = IF(@field3='null',NULL,@field3)

2)没有办法让MySQL LOAD DATA"跳过"文件中的最后一条记录。要让MySQL忽略最后一行,那么在MySQL之外可以更好地处理。例如,从命名管道读取MySQL LOAD DATA,并让一个单独的并发进程读取CSV文件并写入该命名管道。

答案 1 :(得分:0)

如果您可以修改CSV文件,只需添加FIELDS ENCLOSED BY '"'并将null更改为NULL(大写),即可将其加载为NULL。或者,使用\N加载NULL

另外,显然,删除末尾的空行(最有可能导致警告):

stuID,stuName,degreeProg
6902101,A001,\N
6902102,A002,\N
6902103,A003,\N
6902104,A004,\N
6902105,A005,\N