【问题标题】:Load NULL values INT加载 NULL 值 INT
【发布时间】:2018-04-03 05:24:48
【问题描述】:

FIY:

  • 我正在处理来自 Census - FactFinder 的 CVS 文件
  • 使用 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'

出现此消息时它不起作用:

错误 1366 (HY000): 不正确的整数值: '' for column 'FINCP' at 第 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,'');

第一个错误现已消失,但出现以下消息:

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

此消息所指的行是:

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

没有错误信息,所以我不知道到底是什么问题。我只能假设问题是有四个连续的空白值。

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

底线,我有问题:

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

2) 我现在使用 SERIALNO = nullif(@SERIALNO,'') 遇到什么问题

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

谢谢。

【问题讨论】:

  • 您可以使用具有正则表达式功能的文本编辑器吗?
  • @TimBiegeleisen 我可以使用 Edit Pad Lite

标签: mysql sql load


【解决方案1】:

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

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

那么你可能没有这个问题。如果您可以使用正则表达式替换工具,您可以尝试搜索以下模式:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2013-07-30
    • 2021-07-07
    • 2011-02-10
    相关资源
    最近更新 更多