ORA-12899:值对于列来说太大 - 在导出/导入时,都是BYTE语义,而不是CHAR

时间:2018-02-14 12:30:56

标签: oracle

我在一台Windows机器上安装了Oracle DB,并使用SQL Developer 4.0.2.15执行所有表+内容的导出。文件格式为纯文本SQL,ANSI ISO-8859-1。行结尾以UNIX样式(1字节)完成。 表/列定义如下:

"PRODUCTNAME" VARCHAR2(120 BYTE),

当我在目标Windows机器上执行此.sql文件时,将创建表并完成插入。但是一些在PRODUCTNAME中包含正好120个字节的项目(包括1个换行符)无法在目标计算机上插入。 我明白了:

  

ORA-12899:值太大而不适合列" DBNAME"。" TABLENAME"。" PRODUCTNAME" (实际:121,最大值:120)

我不明白为什么。我在这个特定的字符串中没有2字节字符,导出肯定是使用0x0A作为换行符(通过Notepad ++状态行及其HexView插件检查)。我使用drag& drop打开目标机器的SQL开发人员(相同版本)中的.sql文件。当我通过剪贴板将带有换行符的产品名称复制到Notepad ++时,它会计算120个字节的长度。

我不明白,为什么在Oracle开发人员中,脚本会计算这1个额外字符。

我在google上搜索过此内容,并在此处找到了SO等主题,但他们并没有帮助我,或者我不完全理解它们。

我想念什么?请帮忙!

1 个答案:

答案 0 :(得分:1)

创建一个PRODUCTNAME VARCHAR2(200)的临时表(例如,TEST)。将数据导入其中。检查超过120个字符的行。

您可能需要使用DUMP功能,例如

select dump(productname) from test

它会显示存储在该列中的实际数据长度。仅举例:

SQL> select ename, dump(ename) dump_e from emp where rownum = 1;

ENAME      DUMP_E
---------- ----------------------------------------
KING       Typ=1 Len=4: 75,73,78,71
                 -----
                 this!

SQL>

[编辑:TRIM示例]

SQL> with test (id, col) as
  2    (select 1, 'abc'    from dual union
  3     select 2, 'def '   from dual union
  4     select 3, ' ghi  ' from dual
  5    )
  6  select '#' || col       || '#' col,
  7         '#' || trim(col) || '#' new_col
  8  from test
  9  order by id;

COL      NEW_COL
-------- --------
#abc#    #abc#
#def #   #def#
# ghi  # #ghi#

SQL>