使用 SQL*Loader 从文本文件加载后出现额外空格

Extra spaces after loading from a text file with SQL*Loader

我正在使用 Oracle 11g,我正在尝试使用 SQL*Loader 从文本文件加载数据

这是一个数据样本(有更多的列):

123456789876543212,100,333,432,02/05/2014,02/05/2014,02/05/2014,1.1,AA

我想首先将数据作为 VARCHAR2 加载到数据库中,然后通过查询将它们转换为数据库中正确的数据类型。在我看来这要容易得多。

这是我的 table (MyTable):

create table MyTable
(
   A varchar2(500)
   B varchar2(500)
   C varchar2(500)
   D varchar2(500)
   E varchar2(500)
   F varchar2(500)
   G varchar2(500)
   H varchar2(500)
   I varchar2(500)
)

这是我的加载脚本:

load data
infile 'D:\MyFile.txt'
into table MyTable
fields terminated by ','
trailing nullcols
(
       A char(4000),
       B char(4000),
       C char(4000),
       D char(4000),
       E char(4000),
       F char(4000),
       G char(4000),
       H char(4000),
       I char(4000)
)

这是数据加载到数据库后的样子。

1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 2,1 0 0,3 3 3,4 3 2,0 2 / 0 5 / 2 0 1 4,0 2 / 0 5 / 2 0 1 4,0 2 / 0 5 / 2 0 1 4, 1 . 1,A A

为什么我的数据看起来像这样?这些空间是什么?我没有很多数据加载经验。

我猜问题出在数据库和加载文件中 table 的数据类型。定义数据的正确方法是什么?我想将数据按原样加载到数据库中。我将通过查询在数据库中进行对话。请注意第一列有18位数字。

加载后在每个字符之间插入 "spaces" 的正常原因是因为有一个 nul (ASCII 0) after every character in your original text file. If you look at your file in a text editor in Hexadecimal you should be able to see this (it'll be represented as 00). You can also look at your table using the DUMP() 函数。

没有额外的参数,DUMP() 是一个有用的函数,returns 您传递给它的数据的 data-type code,数据的字节长度和 ' 的内部表示'expr''。文档中解释了其他一些选项。

从下面可以看出data-type编码为96,代表一个CHAR,长度为1即字符串长度为1个字节,内部表示为97,也就是ASCII码a.

SQL> select dump('a')
  2    from dual;

DUMP('A')
----------------
Typ=96 Len=1: 97

在您的情况下,您期望空值代码为 0。

我会回到你的供应商那里,告诉他们在你仔细检查后删除这些字符,因为你无法判断它们是实际的空字符还是多字符的一部分字节字符。如果您无法修复文件,我已经从数据库中 previously written about the strategies for removing nuls