尝试加载块元素时 Oracle 中出现多字节字符错误

Multibyte character error in Oracle while trying to load block elements

我们有一个平面文件,我们正尝试使用 SQL*Loader 将其加载到 Oracle 19c table 中,但它失败了,其中一个 CHAR(2) 出现“多字节字符错误”场地。我们知道这是一个垃圾值,但我们仍然必须将它加载到数据库中。数据库字符集为AL32UTF8.

我们尝试加载的值是块元素:U+2592 ▒ Medium shade

我们尝试在 SQL*Loader 控制文件中使用 UTF-8,但仍然面临同样的问题。任何建议如何进行?

命令:

sqlldr $connection parfile=SCHEMA.TABLE.par

错误:

Record 1: Rejected - Error on table SCHEMA.TABLE, column COL2.
Multibyte character error.

COLUMN info :COL2 CHAR(2) NOT NULL ENABLE

参数文件内容:

data=filename.dat
control=SCHEMA.TABLE.ctl
log=SCHEMA.TABLE.log
bad=SCHEMA.TABLE.bad

控制文件内容:

OPTIONS (BINDSIZE=20000000,READSIZE=10485760,ROWS=10000,DIRECT=FALSE,ERRORS=50)
        LOAD DATA
        CHARACTERSET 'AL32UTF8'
        DISCARDMAX 100
        REPLACE PRESERVE BLANKS INTO TABLE SCHEMA.TABLE
        TRAILING NULLCOLS
(
COL1    POSITION(1:15) "NVL(:COL1,' ')",
COL2    POSITION(16:17) "NVL(:COL2,' ')"
)

文件字符集:

filename.dat: text/plain; charset=utf-8

OS: GNU/Linux

From the documentation:

The start and end arguments to the POSITION parameter are interpreted in bytes, even if character-length semantics are in use in a data file.

所以 POSITION(16:17) 是该行的第 16 和第 17 个 字节 ,而不是第 16 个(在您的示例中也是唯一的)字符。 U+2592 字符 is three bytes in UTF-8 - 0xE2 0x96 0x92 (e29692) - 你只看前两个字节;并且那些单独的不代表有效字符。

您可以从使用 POSITION 更改为使用每个字段的固定长度的 CHAR,并指定 LENGTH SEMANTICS CHARACTER:

OPTIONS (BINDSIZE=20000000,READSIZE=10485760,ROWS=10000,DIRECT=FALSE,ERRORS=50)
        LOAD DATA
        CHARACTERSET 'AL32UTF8'
        LENGTH SEMANTICS CHARACTER
        DISCARDMAX 100
        REPLACE PRESERVE BLANKS INTO TABLE SCHEMA.TABLE
        TRAILING NULLCOLS
(
COL1    CHAR(15) "NVL(:COL1,' ')",
COL2    CHAR(2) "NVL(:COL2,' ')"
)