【问题标题】:Why am I getting ORA-01401: inserted value too large for column - when I'm not inserting?为什么我得到 ORA-01401:插入的值对于列来说太大 - 当我不插入时?
【发布时间】:2013-10-23 19:00:35
【问题描述】:

这里有一些 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 就可以了。遗憾的是,我无法更改遇到问题的实际生产数据库的列类型

【问题讨论】:

  • 插入后可能提交?
  • 很明显你正在插入 - 你从INSERT INTO CC_TEST2 (1,'Testing Issue');得到同样的结果吗?
  • 这只是设置测试数据 - Select 语句是错误发生的地方
  • 你能把select * from nls_database_parameters where parameter like '%CHARACTERSET';的结果贴出来吗?

标签: sql oracle


【解决方案1】:

如果将“NAME” NVARCHAR2(255) 更改为“NAME” VARCHAR2(255)(即使用 varchar2),您不会遇到任何问题。您可以在 http://sqlfiddle.com/#!4/cefd8/2

【讨论】:

  • 显然不能从 NVARCHAR2 更改为 VARCHAR2。
  • 好的,然后尝试“to_char(name) ||”它有效,检查这个sqlfiddle.com/#!4/10933/12
  • 谢谢,这似乎是一个解决方案。
  • 我希望您的 NVARCAR2 列中没有不传递 TO_CHAR 的特殊字符。
【解决方案2】:

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

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

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

【讨论】:

  • 您能否提供说明 NVARCHAR2 最大限制的链接? NVARCHAR2 或 VARCHAR2 的最大大小为 4000 字节。但是,NVARCHAR2 始终使用两字节字符集(AL16UTF16 或 UTF8)。 NVARCHAR2 数据类型可以存储的最大字符数为 2000。
  • @tvm 是的,但是当使用连接到 NVARCHAR2 列的过长字符串常量时,您会得到 ORA-01401,而您会看到 ORA-01489 或其他一些错误消息。
【解决方案3】:

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 字节。

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 2016-07-24
    • 2016-08-10
    • 2011-08-18
    • 2015-11-05
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多