为什么我得到ORA-01401:插入的值对于列太大 - 当我没有插入?

时间:2013-10-23 08:57:30

标签: sql oracle

这是一些使用非常简单的表设置的SQL。

CREATE TABLE CC_TEST2 
  ("CURRENCYID" NUMBER NOT NULL ENABLE, 
"NAME" NVARCHAR2(255)) ;


insert into CC_TEST2 (select 1,'Testing issue'from dual);
commit;

然后重新创建问题

    SELECT (step.Name ||
    'Commentary of 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890            1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 12')
 as thing  FROM CC_TEST2 step

有什么想法吗?

我觉得nVarchar2有些奇怪吗?如果我将列类型更改为varChar2,那么就可以了。遗憾的是,我无法更改我遇到问题的实际生产数据库的列类型

3 个答案:

答案 0 :(得分:2)

如果“NAME”NVARCHAR2(255)更改为“NAME”VARCHAR2(255)(即使用varchar2),则不会出现任何问题。你可以测试一下 http://sqlfiddle.com/#!4/cefd8/2

答案 1 :(得分:2)

NVARCHAR2和字符串连接似乎有些奇怪。

请参阅http://sqlfiddle.com/#!4/936c4/2

我基于在SQL Fiddle中运行各种语句的理解是连接运算符右边的字符串常量||也被视为NVARCHAR2,最多可包含1000个字符。

答案 2 :(得分:0)

As per oracle documentation

NCHAR和NVARCHAR2数据类型

NCHARNVARCHAR2是存储Unicode字符数据的Unicode数据类型。它们也称为本机数据类型。

NVARCHAR2数据类型存储可变长度的字符串。

创建具有NVARCHAR2列的表时,指定的最大大小始终为字符长度语义。字符长度语义是NVARCHAR2的默认和唯一长度语义。

例如,如果国家字符集为UTF8,则以下语句定义90字节的最大字节长度:

CREATE TABLE tab1 (col1 NCHAR(30));

NVARCHAR2列的最大长度为4000个字节。它最多可容纳4000个字符。实际数据的最大字节数限制为4000.必须在运行时同时满足两个大小限制。

这一切都取决于你的字符集和长度语义。

Reason for your problem is

  

要记住的另一个重要的事情是,上限   存储在VARCHAR2中的字节数是4,000。但是,即使你   指定VARCHAR2(4000 CHAR),您可能无法容纳4,000   字符进入该字段。事实上,你可能适合尽可能少   如果所有字符占用4个字节,则该字段中包含1,000个字符   用你选择的字符集来表示!

这也适用于Native数据类型。

<强>解决方案:

使用CHAR代替BYTES作为VARCHAR2或CHAR的长度语义。

  

原因是单字节字符中包含20个字符的字符串   set是20个字节长,绝对适合VARCHAR2(20)。   但是,一个20个字符的字段可能长达80个字节   多字节字符集,20个Unicode字符可能不适合   20个字节。