开发者社区 问答 正文

MySQL从CSV数据加载NULL值

我有一个文件,可以包含3到4列以逗号分隔的数值。空字段位于行末时会被定义为例外:

1,2,3,4,5 1,2,3,,5 1,2,3 下表是在MySQL中创建的:

  • ------- + -------- + ------ + ----- + --------- + ------- + | 领域 类型 空| 关键 默认值| 额外|
  • ------- + -------- + ------ + ----- + --------- + ------- + | 一| int(1)| 是的 | NULL | | | 二| int(1)| 是的 | NULL | | | 三| int(1)| 是的 | NULL | | | 四| int(1)| 是的 | NULL | | | 五| int(1)| 是的 | NULL | |
  • ------- + -------- + ------ + ----- + --------- + ------- + 我正在尝试使用MySQL LOAD命令加载数据:

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS TERMINATED BY "," LINES TERMINATED BY "\n"; 结果表:

  • ------ + ------ + ------- + ------ + ------ + | 一| 二| 三| 四| 五|
  • ------ + ------ + ------- + ------ + ------ + | 1 | 2 | 3 | 4 | 5 | | 1 | 2 | 3 | 0 | 5 | | 1 | 2 | 3 | NULL | NULL |
  • ------ + ------ + ------- + ------ + ------ + 问题在于,当原始数据中的字段为空且未定义时,MySQL由于某种原因不使用列默认值(为NULL),而是使用零。当字段全部丢失时,正确使用NULL。

不幸的是,在这一阶段,我必须能够区分NULL和0,因此将不胜感激。

谢谢S。

编辑

SHOW WARNINGS的输出:

  • --------- + ------ + -------------------------------- ------------------------ + | 级别| 代码 留言|
  • --------- + ------ + -------------------------------- ------------------------ + | 警告| 1366 | 错误的整数值:“”对于第2行的“四”列| | 警告| 1261 | 第3行未包含所有列的数据| | 警告| 1261 | 第3行未包含所有列的数据|
  • --------- + ------ + -------------------------------- ------------------------ +

展开
收起
保持可爱mmm 2020-05-10 21:05:23 678 分享 版权
1 条回答
写回答
取消 提交回答
  • 这将做您想要的。它将第四个字段读入局部变量,然后如果该局部变量最终包含一个空字符串,则将实际字段值设置为NULL:

    LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS TERMINATED BY "," LINES TERMINATED BY "\n" (one, two, three, @vfour, five) SET four = NULLIF(@vfour,'') ; 如果它们都可能为空,则将它们全部读入变量并具有多个SET语句,如下所示:

    LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS TERMINATED BY "," LINES TERMINATED BY "\n" (@vone, @vtwo, @vthree, @vfour, @vfive) SET one = NULLIF(@vone,''), two = NULLIF(@vtwo,''), three = NULLIF(@vthree,''), four = NULLIF(@vfour,'') ;来源:stack overflow

    2020-05-10 21:05:48
    赞同 展开评论