如何处理UTF8 sqlldr ORACLE中的特殊字符需要2个字节

问题描述

如何处理特殊字符在sql loader Oracle中的UTF8中需要2个字节

正确显示并存储了字符,以“á”为例。但是,包含这种类型字符的行将滑到数据库表的下一列。由于特殊字符需要2个字节,导致位置丢失的主要问题。

如何保留值列的长度?

file.txt

4351 LUISA  F32345
2312 JOSÉ   M67868

file.ctl

LOAD DATA
CHaraCTERSET UTF8
INFILE file.txt
APPEND INTO TABLE USERAPP
( ID   POSITION(1:5)   CHAR,NAME POSITION(6:12)  CHAR,GEN  POSITION(13:13) CHAR,CODE POSITION(14:20) CHAR)

然后在表中

ID   NAME   GEN CODE 
4351 LUISA  F   32345
2312 JOSÉ       M67868

解决方法

这是您的问题,不能按字符使用排名: “即使数据文件中使用了字符长度语义,POSITION参数的开始和结束参数也将以字节为单位进行解释。”

尝试这种方式:

LOAD DATA
CHARACTERSET AL32UTF8 LENGTH CHAR
INFILE file.txt
APPEND INTO TABLE USERAPP
(
 ID   CHAR(5),NAME CHAR(7),GEN  CHAR(1)
  CODE CHAR(7)
)
,

这对我有用,我一直在寻找上传以下文件的解决方案:

  • UTF8 编码
  • 固定字符(是的,字符,不是固定字节) 宽度

所有其他选项都会在重音字符后面的字段上产生位移,或截断数据。 总结一下:

  • 在接收数据的表中使用字符语义。
  • 使用支持 Unicode 的数据库字符集

这是我的控制文件:

LOAD DATA 
    CHARACTERSET UTF8 LENGTH SEMANTICS CHAR
    INFILE '_FILENAME_' 
APPEND
INTO TABLE TEST_UTF8
(
    NUM_SEGMENT CHAR(3),MESSAGE CHAR(5),LOT_NUMBER CHAR(5)
)

这是表:

create table TEST_UTF8
(
    NUM_SEGMENT varchar2(3 char),MESSAGE varchar2(5 char),LOT_NUMBER varchar2(5 char) 
);

这是示例数据:

Screen snapshot of the data file

001aeiou20350
002á    20350
003áéíóú20350

Hex View of the input file

这是Oracle表中的结果:

NUM_SEGMENT|MESSAGE|LOT_NUMBER|
-----------+-------+----------+
001        |aeiou  |20350     |
002        |á      |20350     |
003        |áéíóú  |20350     |

如您所见,文件已根据字符而非字节拆分为列,并且数据库已正确解释重音字符。

我要感谢 Gábor 提出这种语法,我在 Oracle 文档中没有找到它。我也想投票,但我不能投票,因为我还没有达到要求的声誉。如果有人可以投票,我将不胜感激,这非常有用。

标签:Oracle、SQL*Loader、UTF8