MySql LOAD DATA INFILE 以逗号失败

MySql LOAD DATA INFILE failing with commas

声明如下:

LOAD DATA INFILE '/var/lib/mysql-files/test.csv'
INTO TABLE test 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\' 

这是导入良好的行:

1450327840667357185, 1, "This is my text"

如果文本字段有逗号,则失败。例如,看到这一行:

1450327840667357185, 1, "This is my text, with a comma in it"

为什么会失败?

如果我对逗号进行转义(通过在其前面放置一个反斜杠),它就可以正常工作。但这没有意义。我已经规定字段可以用双引号括起来,那为什么不接受里面的所有内容作为字段的内容呢?

如果我必须重新处理所有文本以引用逗号,那将是一项艰巨的任务。

使用Input Preprocessing。将整行加载到一个变量中,然后将其解析为单独的列。

LOAD DATA INFILE '/var/lib/mysql-files/test.csv'
INTO TABLE test 
-- FIELDS TERMINATED BY ''
(@tmp)
SET column1 = SUBSTRING_INDEX(@tmp, ',', 1),
    @tmp = TRIM(SUBSTRING(@tmp FROM 1 + LOCATE(',', @tmp))),
    column2 = SUBSTRING_INDEX(@tmp, ',', 1),
    column3 = TRIM(BOTH '"' FROM TRIM(SUBSTRING(@tmp FROM 1 + LOCATE(',', @tmp))))

您的 CSV 在 , 分隔符后有 space 秒。

我没有 MySQL 可以玩,但我希望这意味着它将那些 space 视为值的一部分,从而导致各种问题。

这意味着 CSV 行被读取为...

  • VAL = 1450327840667357185
  • SEP = ,
  • VAL = 1
  • SEP = ,
  • VAL = "This is my text
  • SEP = ,
  • VAL = with a comma in it"

请注意,前导 space 包含在值中。

这意味着第三个值不是"开始(它以space),所以 ENCLOSED BY '"' 没有做任何事情。这意味着解析器将字符串视为 unquoted,这反过来意味着随后的 , 被视为分隔符。


尝试TERMINATED BY ', '...

这意味着解析器现在将该行读取为...

  • VAL = 1450327840667357185
  • SEP = ,
  • VAL = 1
  • SEP = ,
  • VAL = "This is my text, with a comma in it"

请注意,第三个值现在 " 开头(因为前导 space现在是分隔符的一部分),所以一个引用字符串 等后续 ,not 视为分隔符。