使用SQL Loader加载UTF8编码的固定宽度文本文件

时间:2017-05-29 08:41:55

标签: oracle utf-8 oracle12c sql-loader

我正在尝试导入固定宽度的文本文件,但我遇到了非ascii charater数据的问题。下面是我可以创建的最小的示例来说明问题。

load data
infile *
truncate into table test
(
   txt position(1:3)
)
BEGINDATA
A
Ö
ABC
ÅÄÖ

这是表格:

create table test(
   txt varchar2(30 char) not null
);

所有记录,但最后一个记录导入得很好。我猜它与字节与字符语义有关。这可以解决我的问题吗? 甚至可以在具有多字节字符数据的文件中讨论固定宽度记录吗?

以下是日志文件的相关部分:

SQL*Loader: Release 11.2.0.1.0 - Production on Mon May 29 10:30:04 2017

Control File: test.dat
Data File:    test.dat
Bad File:     test.bad
Discard File: none specified

(Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:     64 rows, maximum of 256000 bytes
Continuation:    none specified
Path used:      Conventional

Table TEST, loaded from every logical record.
Insert option in effect for this table: TRUNCATE

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
TXT                                   1:3     3           CHARACTER            

Record 4: Rejected - Error on table TEST, column TXT.
Multibyte character error.

Table TEST:
  3 Rows successfully loaded.
  1 Row not loaded due to data errors.

Space allocated for bind array:                    384 bytes(64 rows)
Read   buffer bytes: 1048576

Total logical records skipped:          0
Total logical records read:             4
Total logical records rejected:         1
Total logical records discarded:        0

1 个答案:

答案 0 :(得分:0)

在期望某个宽度和期望某些字段大小的应用程序之间会出现SQL加载问题。

NLS_LENGTH_SEMANTICS允许您根据CHARacters而不是BYTE指定列数据类型的长度。通常这是在使用多字节AL32UTF8时或在您的情况下使用UTF8。

如果未在数据库级别定义,则可以在会话级别设置。

ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE

Oracle建议在创建表时明确使用CHAR。

Create table scott.test (Col1 CHAR(20 CHAR),Col2 VARCHAR2(100 CHAR));

访问PL / SQL中的列时,请明确定义变量,例如

Col2 VARCHAR2 (10 CHAR);