我正在运行以下查询。但是得到 ORA-12899。尽管我试图插入的字符串长度是 30。
INSERT INTO TABLE1 SELECT * FROM temp_Table1 where LENGTH(column1)=30;
SQL Error: ORA-12899:value too large for column "TABLE1"."column1" (actual: 31, maximum: 30)
select column1 from temp_Table1 where LENGTH(column1)=30;
Testing - HLC/TC Design Corre
Desc temp_Table1
column1 VARCHAR2(30)
Desc Table1
column1 VARCHAR2(30)
原文由 Shitu 发布,翻译遵循 CC BY-SA 4.0 许可协议
您会看到 字符和字节长度语义 之间的区别:
如果您的会话使用字节语义,则表中的列将默认为:
这与明确执行以下操作相同:
如果您的源数据是五个字符但包含任何多字节字符,则 字节 数将超过五个:
这就是你所看到的。当您从其他表中插入值时,您将过滤值的长度,但
length()
计算字符而不是字节。有一个lengthb()
函数可以计算字节数。如果您检查您选择的 30 个字符值的字节长度,您会发现它实际上是 31 个字节,因此其中一个字符是多字节的。From the
dump()
values you can see that afterTesting
(54,65,73,74,69,6e,67
) and before the space and dash (20,2d
) you havec2,a0
是 UTF-8 多字节不间断空格字符。 (您经常在从 Word 文档复制的文本中看到,以及大引号和其他非 ASCII 范围字符)。您可以更改插入以过滤
LENGTHB(column1)=30
(这将排除您当前找到的行),或者将列定义更改为 30 个字符而不是 30 个字节:或者,如果可能并且对您的数据有意义,则将任何意外的多字节字符替换为单字节等效字符;在这种情况下,一个正常的空间 可能会 起作用,但任何替换都会破坏可能实际上很重要的信息。