我正在尝试导入固定宽度的文本文件,但我遇到了非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
答案 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);