抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

关于Oracle中使用 SQLLDR 有时候会出现关于空格保留或去除的问题,就这个问题的解决方案有不少,但如果是由于参数设置问题,可能就本文所说的问题解决。

参考文章: http://blog.sina.com.cn/s/blog_701218960100l0gt.html

使用 SQLLDR 加载入库,一般就使用分隔符取值或者定长取值。使用 分隔符取值 时,空格是会保留的,而使用 定长取值 的时候就会自动去除空格(本文所说空格指内容前后的空格,不包括文字中的空格)。

关于参数“PRESERVE BLANKS

SQLLDR 中有一个参数“PRESERVE BLANKS”,用于控制定长时的空格保留。

input file 是分隔符时,_control file_ 中的 PRESERVE BLANKS 无效;
input file 是定长时,_control file_ 中的 PRESERVE BLANKS 有效。

所以,定长取值 时,可以加 PRESERVE BLANKS 这个参数,_保留空格入库_。

可以在 TRUNCATE INTO TABLE 中加入该参数,全部字段都保留空格,如:

ctl文件
1
2
3
4
5
6
7
8
9
LOAD DATA 
CHARACTERSET 'UTF8'
INFILE '/home/a.dat'
TRUNCATE PRESERVE BLANKS INTO TABLE A
(
a POSITION(1:5),
b POSITION(6:11),
d POSITION(12:13)
)

也可以在字段后加如该参数,只保留该字段空格,如:

ctl文件
1
2
3
4
5
6
7
8
LOAD DATA 
INFILE '/home/a.dat'
TRUNCATE INTO TABLE A
(
a POSITION(1:5),
b POSITION(6:11) PRESERVE BLANKS ,
d POSITION(12:13)
)

利用 trim() 去除空格

定长取值默认是自动去除空格的,而分隔符取值则会保留空格入库。所以,去除空格可以利用
trim() 函数。如:

ctl文件
1
2
3
4
5
6
7
8
9
10
LOAD DATA 
CHARACTERSET 'UTF8'
INFILE '/home/a.txt'
TRUNCATE INTO TABLE A
FIELDS TERMINATED BY ''
(
a "trim(:a)",
b "trim(:b)",
d "trim(:d)"
)

总结

对于SQLLDR保留或去除空格,可以分按如下操作:

  • 定长:
    • 保留:加入参数 PRESERVE BLANKS
    • 去除:默认去除,无需操作
  • 分隔符:
    • 保留:默认保留
    • 去除:使用 trim() 函数

评论