暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL Loader -多字节字符错误

askTom 2016-10-05
527

问题描述

嗨,小队

当我尝试使用sqldr加载UTF8字符集数据文件时,它失败并出现多字节字符错误。

重现问题的步骤:

1.创建表。

创建表LoaderTest(
rec_no编号,
rec_id_no nvarchar2(30) ,
列1 varchar2 ( 2000个字符) ,
列2 varchar2(255) ,
第3栏varchar2(2000) ;

2.控制文件(TEST.ctl)

加载数据
字符集UTF8
替换
保留空白
--记录类型61 :对帐单行
进入表加载器测试
当rec_id_no =': 61'
尾随空号
(Rec_noRECNUM、,
rec_id_no位置(1:3)CAL
由空格"ltIM(:rec_id_no, ':')",
第1列位置(5:10)字符,
第3列位置(11:110)

--记录类型61 :补充详细信息(将rec_id_no设置为9 )
进入表ce_stmt_int_tmp
当接收ID号<> ':'
尾随空号
(Rec_noRECNUM、,
rec_id_no位置(1:1) ,
第1列位置(1:2000)字符)

--记录类型86 :信息发送给帐户所有者
进入表ce_stmt_int_tmp
当rec_id_no =': 86'
尾随空号
(Rec_noRECNUM、,
rec_id_no位置(1:3)CAL
由空格"ltIM(:rec_id_no, ':')",
第1列位置(5:2000)字符)

3.数据文件有下面的行。

:86:/PT/FT/PY/ Оплата по счету No731 от 26.08.2016 за аренду в сент
ябре 2016 гВКЛЮЧАЯ НДС 18%15761.59/BN/ ОАО Русские самоцветы 407
02810432000005783/AB/044030790 ПАО БАНК САНКТ - ПЕТЕРБУРГ / AB3/ △。СА
НКТ - ПЕТЕРБУРГ / AB4/40702810400005783/BTC/12/ ИНН - 7806007100

4.执行以下命令

sqllldr userid=apps/apps@fb4yd213控件=测试.ctl,DATA= datafile.dat

5.日志文件显示:

用于用于“行”参数的值已从64更改为61
记录2 :已拒绝-表的错误,列REC_ID_NO。
多字节字符错误。
记录4 :已拒绝-表的错误,列REC_ID_NO。
多字节字符错误。

如果您能就此提供任何建议,我将不胜感激。

提前感谢您的帮助。

致以最诚挚的问候,
普拉蒂马


专家解答

来自MOS注释435128.1

========================
SQL*Loader示例:将数据加载到Unicode字符集(UTF8/AL32UTF8)数据库(文档ID 435128.1)到底部BottomTo

在本文档中
目标
解决方案
适用于:

Oracle Database - Enterprise Edition - 8.1.7.0版及更高版本
本文档中的信息适用于任何平台。
***已于2013年7月30日检查相关性***
目标

您正在尝试将数据加载到基于Unicode字符集的数据库中,如UTF8或AL32UTF8。

您现在发现以前使用的分隔符不再按预期工作。

解决方案

此问题有多个潜在来源:

a.用于将数据加载到Unicode数据库的平面/文本文件的字符编码:

b。SQL*Loader控制文件中指定的字符集(或左至默认值)与平面/文本文件使用的字符集编码不匹配

c.为NLS_Lang定义的字符集不正确,或保留为无法识别使用的字符代码点的默认值(US7ASCII)

d。CHCP (MSWIN)的LocalE (Unix/LinUX)不处理使用的字符代码点

e.用作分隔符的字符代码点*不唯一* ,因为平面/文本文件中的某些当前数据与分隔符匹配

对于我们的示例,我们将声明cedilla (ç)用作字段分隔符,并且数据库字符集最近已更改为UTF8。

问题场景

a.未设置NLS_L。此选项默认为美国_AMRICA.US7ASCII ,并且没有cedilla的定义,或者,设置NLS_lang=AMericAN_AMRICA.UTF8

备注:与此问题无关,字符集定义会影响所看到的结果。

下面是SQL*Loader控制文件的示例:

加载数据
文件*
附加
进入表EMP1
由"ç"终止的字段(可选由'"'括起来)
(
恩普诺,
姓名,工作,经理,
租用日期(20) "DD-月-YYYY" ,
萨尔,
通信,
部门
)
开始数据
7782c“克拉克”“经理”7839c 1981年6月9日至1981年6月2572.50c 10c
7839c "国王"总统" ç 1981年11月17日5500.00c 10c
7658 &'93 ;分析员&'94 ; 7566 &'94 ; 1982年5月3日至5月3日至3450 &'94 ; 20

以下是测试:

带9i

D:\oracle92\ora92\BIN> SET NLS_ lang=AMRICAN_AMRICA.UTF8
D:\oracle92\ora92\IN> sqldr控件=ulcases.ctl

用户名: scott/tiger

SQL* Loader : 9.2.0.1.0版- 2007年6月6日星期三11:45:08的生产
版权所有(c) 1982, 2002, Oracle Corporation。保留所有权利。

SQL*Loader-625 :控制文件中的多字节字符错误。

10gR2

D:\oracle\product\10.2.0\db_10gR2\BIN>设置NLS_lang=AMRICAN_AMRICA.UTF8
D:\oracle\product\10.2.0\db_10gR2\IN> sqldr控件=ulcases.ctl
用户名: scott
密码:

SQL* Loader : 10.2.0.1.0版- 2007年6月6日星期三11:37:17的生产
版权所有(c) 1982, 2005, Oracle。保留所有权利。

SQL*Loader-625 :控制文件中的多字节字符错误。

更改NLS_ lang以匹配输入文件的编码,并允许我们“查看”和使用最初使用单字节字符集规则存储的cedilla

正确设置

对于Windows

设置NLS_lang=AMRICAN_AMRICA.WE8ISO8859P1

对于Linux/Unix

导出NLS_ lang=AMRICAN_AMRICA.WE8ISO8859P1

D:\oracle\product\10.2.0\db_10gR2\IN> sqldr控件=ulcases.ctl
用户名: scott/tiger

SQL* Loader : 10.2.0.1.0版- 2007年6月6日星期三11:13:03的生产

版权所有(c) 1982, 2005, Oracle。保留所有权利。
已达到提交点-逻辑记录计数3

SQL>从emp1中选择* ;

EMPNO姓名职位经理聘用日期销售部
-------------------------------------------------------------------------------------------------------------------------------------------------
7782克拉克经理7839 09-JUN-81 2572.5 10
7839国王总统, 11月17日-81 5500 10
7658 Chan分析员7566 03- May-82 3450 20

讨论

SQL*Loader控制文件的NLS_ lang字符集和平面/文本文件的编码不必与数据库字符集匹配。这意味着您可以使用多个不同的字符集源将数据加载到一个Unicode数据库中。例如,您可以使用基于希腊语的单字节字符集加载希腊语数据,如EL8ISO8859P7 (ISO 8859-7)、Cyrillic CL8MSWIN1251 (ANSI 1251)和AR8ISO8859P6 (ISO 8859-6)将数据加载到UTF8/AL32UTF8数据库中。要求是使用正确的文件编码,将操作系统和NLS_ lang设置为正确的源规则。

当DBA接收到一个平面/文本文件时,源数据的编码并不总是已知的:但是,如果数据不是基于US7ASCII的,则使用SQL*Loader加载数据是非常关键的

操作系统要求能够识别规则,并且必须配置为处理平面/文本文件中使用的数据编码。这意味着应该正确设置操作系统中的LocalE、CHCP ,并且NLS_Lang变量也应该使用能够理解所有正在加载的数据的字符集。

您*不需要*使用用于平面/文本文件中字符串数据的精确字符集规则,因为这些规则可以用于超级设置。

例如WE8MSWIN1252是WE8ISO8859p1的严格物理超集
========================
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论