我在一台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等主题,但他们并没有帮助我,或者我不完全理解它们。
我想念什么?请帮忙!
答案 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>