加载NULL值INT

时间:2018-04-03 05:24:48

标签: mysql sql load

FIY:

  • 我正在使用人口普查中的CVS文件 - FactFinder
  • 使用MySQL 5.7
  • 操作系统是Windows 10 PRO

所以,我创建了这个表:

+----------+------------+------+-----+---------+-------+
| Field    | Type       | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+-------+
| SERIALNO | bigint(13) | NO   | PRI | NULL    |       |
| DIVISION | int(9)     | YES  |     | NULL    |       |
| PUMA     | int(4)     | YES  |     | NULL    |       |
| REGION   | int(1)     | YES  |     | NULL    |       |
| ST       | int(1)     | YES  |     | NULL    |       |
| ADJHSG   | int(7)     | YES  |     | NULL    |       |
| ADJINC   | int(7)     | YES  |     | NULL    |       |
| FINCP    | int(6)     | YES  |     | NULL    |       |
| HINCP    | int(6)     | YES  |     | NULL    |       |
| R60      | int(1)     | YES  |     | NULL    |       |
| R65      | int(1)     | YES  |     | NULL    |       |
+----------+------------+------+-----+---------+-------+

并尝试使用以下方式加载数据:

LOAD DATA INFILE "C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/Housing_Illinois.csv"
INTO TABLE housing
CHARACTER SET latin1
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n'

这条消息显示无效:

  

ERROR 1366(HY000):不正确的整数值:''列'FINCP'位于'   第2行

错误消息所指的行是:

  

2012000000051,3,104,2,17,1045360,1056030,8200,1,1

我认为FINCP是空白值,就在8200之前是问题所在。所以我按照这个帖子说明:MySQL load NULL values from CSV data

并将我的代码更新为:

LOAD DATA INFILE "C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/Housing_Illinois.csv"
INTO TABLE housing
CHARACTER SET latin1
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n'
(@SERIALNO, @DIVISION, @PUMA, @REGION, @ST, @ADJHSG, @ADJINC, @FINCP, @HINCP, @R60, @R65)
SET
SERIALNO = nullif(@SERIALNO,''),
DIVISION = nullif(@DIVISION,''),
PUMA = nullif(@PUMA,''),
REGION = nullif(@REGION,''),
ST = nullif(@ST,''),
ADJHSG = nullif(@ADJHSG,''),
ADJINC = nullif(@ADJINC,''),
FINCP = nullif(@FINCP,''),
HINCP = nullif(@HINCP,''),
R60 = nullif(@R60,''),
R65 = nullif(@R65,'');

第一个错误现在消失,但会显示以下消息:

  

'对于第12行的列'R65'整数值:'

此消息所指的行是:

  

2012000000318,3,1602,2,17,1045360,1056030 ,,,,

Theres没有错误消息所以我不知道究竟是什么问题。我只能假设问题是有四个连续的空白值。

另一个提示,如果我使用CSV并将所有空白更改为0,代码会变得苍白,但我不是粉丝或编辑原始数据,所以我想知道其他选项。

最重要的是,我不得不提问:

1)不应该用MySQL应该使用的第一个代码加载数据,因为null和0是一个普通的0?

2)问题是我现在正在使用SERIALNO = nullif(@SERIALNO,'')

我希望能够区分0和null /空白值。

谢谢。

1 个答案:

答案 0 :(得分:0)

MySQL LOAD DATA工具将\N解释为NULL值。所以,如果您的问题行看起来像这样:

2012000000318,3,1602,2,17,1045360,1056030,\N,\N,\N,\N
那么你可能没有这个问题。如果您可以访问正则表达式替换工具,则可以尝试搜索以下模式:

(?<=^)(?=,)|(?<=,)(?=,)|(?<=,)(?=$)

然后,替换为\N。这应该用\N填充所有空槽,在语义上它将被MySQL解释为NULL。请注意,如果您要从MySQL 一个表,那么空值将替换为\N。问题是您的数据源和MySQL不了解彼此。