单个字符被视为两个字符

时间:2014-11-20 07:30:38

标签: csv oracle11g sql-loader

使用SQL Loader将CSV文件(从Excel生成)上传到Oracle数据库时,出现此错误:

  

记录1:已拒绝 - 表格TBL01,列GENDER上出错。

     

ORA-12899:值太大而不能列#34; TST"。" TBL01"。" GENDER" (实际:2,最大值:1)

请指导我完成编码控制文件的正确方法。


CSV文件内容

enter image description here


控制文件内容

LOAD DATA
CHARACTERSET AL32UTF8
INFILE TBL01.csv 
INTO TABLE TBL01
FIELDS TERMINATED BY ',' 
(ID, INITIALS, GENDER)


TBL01结构

Name   Null Type         
------ ---- ------------ 
ID          NUMBER       
INITIALS    VARCHAR2(30) 
GENDER      CHAR(1)    

3 个答案:

答案 0 :(得分:0)

我认为GENDERVARCHAR2(N),其中N是最大长度(以字节为单位)(默认情况下)。在这种情况下,您可以更改列类型:

GENDER VARCHAR2(N CHAR)

给出字符的最大长度而不是字节。

或者您只是有一个小N(表格列大小允许的最大值为4000)

答案 1 :(得分:0)

尝试使用TRIM删除无关的空格(如果存在),但我怀疑字符集可能是个问题?我没有这方面的经验,但是如果你使用的是一个2字节的字符集并试图将它放在表中的一个字节中,那么这可能是个问题吗?无论如何要验证的东西。确保数据库使用您在控制文件中指定的相同字符集。

LOAD DATA
CHARACTERSET AL32UTF8
INFILE TBL01.csv 
INTO TABLE TBL01
FIELDS TERMINATED BY ',' 
(ID, 
 INITIALS, 
 GENDER "TRIM(:GENDER)"
)

答案 2 :(得分:0)

与@Multisync讨论:

他/她建议(这是可行的,但我的案例涉及许多修改):

  

最简单的解决方案是在每行的最后一列之后加上逗号

     

通常csv行看起来像:1,3,4,5,6;

     

在这种情况下,你可以使用FIELDS TERMINATED BY';'在您的控制文件中

最后我在我的控制文件中添加了另一行,问题解决了,因为在每个csv行的末尾都有回车符。

    LOAD DATA
    CHARACTERSET AL32UTF8
    INFILE TBL01.csv 
    INTO TABLE TBL01
    FIELDS TERMINATED BY ',' 
    (ID, 
     INITIALS, 
     GENDER  TERMINATED BY '\r')