将数据从文本文件加载到数据库
Load data from text file to DB
数据:
1|\N|"First\Line"
2|\N|"Second\Line"
3|100|\N
\N
表示 MYSQL 和 MariaDB 中的 NULL
。
我正在尝试使用 LOAD DATA LOCAL INFILE
方法将上述数据加载到名为 ID_OPR.
的 table 中
Table结构:
CREATE TABLE ID_OPR (
idnt decimal(4),
age decimal(3),
comment varchar(100)
);
我的代码如下所示:
LOAD DATA LOCAL INFILE <DATA FILE LOCATION> INTO TABLE <TABLE_NAME> FIELDS TERMINATED BY '|' ESCAPED BY '' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n';
此代码的问题是它因错误 Incorrect decimal value: '\N' For column <Column name>
而中止。
问题:
如何使用第二个小数列中的 NULL
值加载此数据,同时又不丢失第三个字符串列中的 \(Backslash)
?
我正在尝试这是 MariaDB,它在大多数情况下类似于 Mysql。
更新:
我提到的错误看起来像警告,数据实际上正在加载到 table。但这里的问题在于文本数据。
例如:上面的第三条记录被作为 \N 本身加载到字符串列中。但我希望它为 NULL。
有什么办法可以让软件识别这个空值吗?像在 oracle 中解码?
你不能同时拥有它 - \
要么是转义字符,要么不是。来自 MySQL docs:
If the FIELDS ESCAPED BY
character is empty, no characters are escaped and NULL
is output as NULL
, not \N
. It is probably not a good idea to specify an empty escape character, particularly if field values in your data contain any of the characters in the list just given.
因此,我建议使用格式一致的输入文件,但生成的文件是:
- 如果要在字符串中保留反斜杠,请使用
\
- 在加载命令中使
\
成为转义字符
或
- 使字符串始终(非可选)括在引号中
- 将转义字符留空,原样
- 对空值使用
NULL
,而不是 \N
顺便说一句,这也解释了您在小数字段中加载 \N
时遇到的警告。
用空格处理空值。那应该可以解决它。
1||"First\Line"
2||"Second\Line"
3|100|
这就是 CSV 和 TSV 上处理空值的方式。并且不要期望 decimal 数据类型变为 null,因为它保持为 0,如果需要,请改用 int 或 bigint。你应该忘记 "ESCAPED BY";只要字符串数据被处理转义问题的“”括起来。
我们需要三个文本文件和 1 个批处理文件来加载数据:
假设你的文件位置'D:\loaddata'
你的文本文件'D:\loaddata\abc.txt'
1. D:\loaddata\abc.bad -- 空
2. D:\loaddata\abc.log -- 空
3.D:\loaddata\abc.ctl
一种。为无分隔符编写下面的代码
OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000)
load data
infile 'D:\loaddata\abc.txt'
TRUNCATE
into table Your_table
(
a_column POSITION (1:7) char,
b_column POSITION (8:10) char,
c_column POSITION (11:12) char,
d_column POSITION (13:13) char,
f_column POSITION (14:20) char
)
b。在下面为逗号分隔符编写代码
OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000)
load data
infile 'D:\loaddata\abc.txt'
TRUNCATE
into table Your_table
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(a_column,
b_column,
c_column,
d_column,
e_column,
f_column
)
4.D:\loaddata\abc.bat "Write Code Below"
sqlldr db_user/db_passward@your_tns control=D:\loaddata\abc.ctl log=D:\loaddata\abc.log
双击 "D:\loaddata\abc.bat" 文件后,您的数据将被加载到 desire oracle table。如果有任何问题,请检查您 "D:\loaddata\abc.bad" 和 "D:\loaddata\abc.log" 文件
数据:
1|\N|"First\Line"
2|\N|"Second\Line"
3|100|\N
\N
表示 MYSQL 和 MariaDB 中的 NULL
。
我正在尝试使用 LOAD DATA LOCAL INFILE
方法将上述数据加载到名为 ID_OPR.
Table结构:
CREATE TABLE ID_OPR (
idnt decimal(4),
age decimal(3),
comment varchar(100)
);
我的代码如下所示:
LOAD DATA LOCAL INFILE <DATA FILE LOCATION> INTO TABLE <TABLE_NAME> FIELDS TERMINATED BY '|' ESCAPED BY '' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n';
此代码的问题是它因错误 Incorrect decimal value: '\N' For column <Column name>
而中止。
问题:
如何使用第二个小数列中的 NULL
值加载此数据,同时又不丢失第三个字符串列中的 \(Backslash)
?
我正在尝试这是 MariaDB,它在大多数情况下类似于 Mysql。
更新: 我提到的错误看起来像警告,数据实际上正在加载到 table。但这里的问题在于文本数据。
例如:上面的第三条记录被作为 \N 本身加载到字符串列中。但我希望它为 NULL。
有什么办法可以让软件识别这个空值吗?像在 oracle 中解码?
你不能同时拥有它 - \
要么是转义字符,要么不是。来自 MySQL docs:
If the
FIELDS ESCAPED BY
character is empty, no characters are escaped andNULL
is output asNULL
, not\N
. It is probably not a good idea to specify an empty escape character, particularly if field values in your data contain any of the characters in the list just given.
因此,我建议使用格式一致的输入文件,但生成的文件是:
- 如果要在字符串中保留反斜杠,请使用
\
- 在加载命令中使
\
成为转义字符
或
- 使字符串始终(非可选)括在引号中
- 将转义字符留空,原样
- 对空值使用
NULL
,而不是\N
顺便说一句,这也解释了您在小数字段中加载 \N
时遇到的警告。
用空格处理空值。那应该可以解决它。
1||"First\Line"
2||"Second\Line"
3|100|
这就是 CSV 和 TSV 上处理空值的方式。并且不要期望 decimal 数据类型变为 null,因为它保持为 0,如果需要,请改用 int 或 bigint。你应该忘记 "ESCAPED BY";只要字符串数据被处理转义问题的“”括起来。
我们需要三个文本文件和 1 个批处理文件来加载数据:
假设你的文件位置'D:\loaddata'
你的文本文件'D:\loaddata\abc.txt'
1. D:\loaddata\abc.bad -- 空
2. D:\loaddata\abc.log -- 空
3.D:\loaddata\abc.ctl
一种。为无分隔符编写下面的代码
OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000)
load data
infile 'D:\loaddata\abc.txt'
TRUNCATE
into table Your_table
(
a_column POSITION (1:7) char,
b_column POSITION (8:10) char,
c_column POSITION (11:12) char,
d_column POSITION (13:13) char,
f_column POSITION (14:20) char
)
b。在下面为逗号分隔符编写代码
OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000)
load data
infile 'D:\loaddata\abc.txt'
TRUNCATE
into table Your_table
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(a_column,
b_column,
c_column,
d_column,
e_column,
f_column
)
4.D:\loaddata\abc.bat "Write Code Below"
sqlldr db_user/db_passward@your_tns control=D:\loaddata\abc.ctl log=D:\loaddata\abc.log
双击 "D:\loaddata\abc.bat" 文件后,您的数据将被加载到 desire oracle table。如果有任何问题,请检查您 "D:\loaddata\abc.bad" 和 "D:\loaddata\abc.log" 文件