问题描述
如何处理特殊字符在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
这是Oracle表中的结果:
NUM_SEGMENT|MESSAGE|LOT_NUMBER|
-----------+-------+----------+
001 |aeiou |20350 |
002 |á |20350 |
003 |áéíóú |20350 |
如您所见,文件已根据字符而非字节拆分为列,并且数据库已正确解释重音字符。
我要感谢 Gábor 提出这种语法,我在 Oracle 文档中没有找到它。我也想投票,但我不能投票,因为我还没有达到要求的声誉。如果有人可以投票,我将不胜感激,这非常有用。
标签:Oracle、SQL*Loader、UTF8