为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL从CSV数据加载NULL值

MySQL从CSV数据加载NULL值

慕尼黑的夜晚无繁华 2019-07-26 14:41:08
MySQL从CSV数据加载NULL值我有一个文件,可以包含3到4列数字,用逗号分隔。当空字段位于行的末尾时,将定义空字段:1,2,3,4,51,2,3,,51,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行的第4列'| 警告| 1261 | 第3行不包含所有列的数据| 警告| 1261 | 第3行不包含所有列的数据+ --------- + ------ + -------------------------------- ------------------------ +
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

这将做你想要的。它将第四个字段读入局部变量,然后将实际字段值设置为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,'')

;


查看完整回答
反对 回复 2019-07-26
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

MySQL手册说:

使用LOAD DATA INFILE读取数据时,使用''更新空列或缺少列。如果要在列中使用NULL值,则应在数据文件中使用\ N. 在某些情况下也可以使用文字“NULL”。

所以你需要用\ N替换空白像这样:

1,2,3,4,51,2,3,\N,51,2,3


查看完整回答
反对 回复 2019-07-26
?
达令说

TA贡献1821条经验 获得超6个赞

根据数据库配置,行为会有所不同。在严格模式下,这会抛出错误,否则会发出警告。以下查询可用于标识数据库配置。

mysql> show variables like 'sql_mode';


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 1092 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信