加载 NULL 值 INT
Load NULL values INT
预估:
- 我正在使用来自 Census - FactFinder 的 CVS 文件
- 使用 MySQL 5.7
- OS 是 Windows 10 PRO
所以,我创建了这个 table:
+----------+------------+------+-----+---------+-------+
| 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): Incorrect integer value: '' for column 'FINCP' at
row 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,'');
第一个错误现已消失,但会出现此消息:
' for column 'R65' at row 12t integer value: '
此消息所指的行是:
2012000000318,3,1602,2,17,1045360,1056030,,,,
没有错误信息,所以我不知道到底是什么问题。我只能假设问题是有四个连续的空白值。
另一个提示,如果我使用 CSV 并将所有空白更改为 0,代码会顺利进行,但我不是粉丝或编辑原始数据,所以我想知道其他选项。
底线,我有问题:
1) 不应该用第一个代码加载数据,因为 MySQL 应该将 , 作为 null 而 0 是普通的 0?
2) 我现在正在使用 SERIALNO = nullif(@SERIALNO,'')
我希望能够区分 0 和 null/blank 值。
谢谢。
MySQL 的 LOAD DATA
工具将 \N
解释为 NULL
值。所以,如果您遇到问题的行看起来像这样:
2012000000318,3,1602,2,17,1045360,1056030,\N,\N,\N,\N
那么你可能没有这个问题。如果您可以使用正则表达式替换工具,您可以尝试搜索以下模式:
(?<=^)(?=,)|(?<=,)(?=,)|(?<=,)(?=$)
然后,替换为\N
。这应该用 \N
填充所有空槽,这在语义上将被 MySQL 解释为 NULL
。请注意,如果您要从 MySQL 中 写入 一个 table,则空值将被替换为 \N
。问题是您的数据源和 MySQL 彼此不了解。
预估:
- 我正在使用来自 Census - FactFinder 的 CVS 文件
- 使用 MySQL 5.7
- OS 是 Windows 10 PRO
所以,我创建了这个 table:
+----------+------------+------+-----+---------+-------+
| 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): Incorrect integer value: '' for column 'FINCP' at row 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,'');
第一个错误现已消失,但会出现此消息:
' for column 'R65' at row 12t integer value: '
此消息所指的行是:
2012000000318,3,1602,2,17,1045360,1056030,,,,
没有错误信息,所以我不知道到底是什么问题。我只能假设问题是有四个连续的空白值。
另一个提示,如果我使用 CSV 并将所有空白更改为 0,代码会顺利进行,但我不是粉丝或编辑原始数据,所以我想知道其他选项。
底线,我有问题:
1) 不应该用第一个代码加载数据,因为 MySQL 应该将 , 作为 null 而 0 是普通的 0?
2) 我现在正在使用 SERIALNO = nullif(@SERIALNO,'')
我希望能够区分 0 和 null/blank 值。
谢谢。
MySQL 的 LOAD DATA
工具将 \N
解释为 NULL
值。所以,如果您遇到问题的行看起来像这样:
2012000000318,3,1602,2,17,1045360,1056030,\N,\N,\N,\N
那么你可能没有这个问题。如果您可以使用正则表达式替换工具,您可以尝试搜索以下模式:
(?<=^)(?=,)|(?<=,)(?=,)|(?<=,)(?=$)
然后,替换为\N
。这应该用 \N
填充所有空槽,这在语义上将被 MySQL 解释为 NULL
。请注意,如果您要从 MySQL 中 写入 一个 table,则空值将被替换为 \N
。问题是您的数据源和 MySQL 彼此不了解。