尝试加载块元素时 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
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,' ')"
)
我们有一个平面文件,我们正尝试使用 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
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,' ')"
)