我在一台Windows机器上有一个Oracle DB,并使用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插件进行检查)。我使用拖放打开目标机器的(相同版本)中的.sql文件。当我通过剪贴板将产品名及其行中断复制到Notepad++时,它会计算120个字节的长度。
我不明白,为什么在Oracle开发人员中脚本计算了这一个额外的字符。
我在google上搜索过这个,并在上面找到了一些主题,但是它们对我没有帮助,或者我不完全理解它们。
我错过了什么?请帮帮我!
发布于 2018-02-14 12:52:51
创建一个具有PRODUCTNAME VARCHAR2(200)的临时表(例如,测试)。将数据导入其中。检查超过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>https://stackoverflow.com/questions/48787297
复制相似问题