【问题标题】:SQL Loader : Multibyte character errorSQL 加载程序:多字节字符错误
【发布时间】:2018-07-09 07:05:39
【问题描述】:

我正在尝试使用 SQL 加载器通过控制文件将包含多字节(特殊)字符的记录很少的文件加载到 Oracle 表中。但是如果我使用下面的控制文件,它会给我多字节字符错误。

LOAD DATA
CHARACTERSET UTF8
INTO TABLE MY_DB.T1
(
MESSAGE BOUNDFILLER POSITION(437:515) CHAR,
FILLER ":MESSAGE",
MY_DTE DATE "DDMMYYYYHH24MISS" "CASE WHEN 1=1 THEN NULL ELSE NULL END",
XTRA_TXT POSITION(516:755) CHAR
)

特殊字符在530的位置。

在其他情况下,当我将 FILLER 字段放置在 MY_DTE 字段之后的控制文件末尾而不进行任何其他更改时,记录已成功加载。

另外,如果我保持控制文件原样并在特殊字符位置(530)之前添加任何字符,那么记录也会成功加载。

我不确定真正导致问题的原因。 PS- 表中字段FILLER的类型为VARCHAR2(79 BYTE)

【问题讨论】:

  • 您收到的实际错误信息是什么?还有什么是 DB 字符集,在 516:755 位置实际有多少个字符和多少个字节?
  • 在日志中我可以找到错误为:RECORD 616 : Rejected - Error on table My_DB.T1, column MY_DTE。
  • 另外,表 NLS_DATABASE_PARAMETERS 中的 NLS_CHARACTERSET 是 UTF8 而 NLS_LANGUAGE 是 AMERICAN
  • @AlexPoole 从 516 开始的字符看起来像:REBATE JAN 17 â DEC 17 .....剩余空间直到第 755 个字符
  • 您是在 Windows 还是 Linux 上工作?我假设文件实际上保存为 UTF-8?

标签: oracle sql-loader


【解决方案1】:

为了使其正常工作,请在使用 sqlloader 之前进行以下操作:

  • 将您的 LOCALE 设置为 UTF-8(在 Windows 中为 chcp 65001
  • NLS_LANG 环境变量设置为 UTF-8,例如set NLS_LANG=.AL32UTF8
  • 在您的 sqlloader 文件中声明 CHARACTERSET UTF8

那么它应该可以工作了。

【讨论】:

  • 按照建议我导出了变量 LOCALE 和 NLS_LANG 但仍然面临同样的错误
  • 您确定您的文件保存为 UTF-8 吗?
  • 是的..如果我将特殊字符向右移动一个位置,它会以“-”的形式加载到表中。即使我从 .CTL 文件中删除了 FILLER 字段,它也能正常工作修改数据
  • 为什么移动一个字符就证明文件是UTF-8?可以分享一行数据吗?
  • 我只是添加了我尝试过的一件事......特殊字符为 -REBATE JAN 17 â DEC 17 的文本的某些部分......直到最后的休息空间。加载到table中的特殊字符可以看成'-'
猜你喜欢
  • 2017-05-11
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多