【问题标题】:Multibyte character error in Oracle while trying to load block elements尝试加载块元素时Oracle中的多字节字符错误
【发布时间】:2021-06-09 11:27:17
【问题描述】:

我们有一个平面文件,我们正尝试使用 SQL*Loader 将其加载到 Oracle 19c 表中,但是对于 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

操作系统:GNU/Linux

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

    From the documentation:

    POSITION 参数的开始和结束参数以字节为单位进行解释,即使数据文件中使用了字符长度语义。

    所以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,' ')"
    )
    

    【讨论】:

    • 非常感谢。这在我上面提到的测试表的情况下有效。如果表也有 Char、varchar2、number、data 列怎么办。它给出了“LENGTH SEMANTICS CHARACTER”的语法错误
    • 最好问一个新问题,包括你当前的控制文件、表DDL、示例数据文件和你得到的完整错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2014-06-14
    • 2017-05-11
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多