【问题标题】:Oracle not able to insert data into varchar2(4000 char) columnOracle 无法将数据插入 varchar2(4000 char) 列
【发布时间】:2019-12-23 19:45:01
【问题描述】:

我使用 Oracle 12c。我的数据库中有下表。

CREATE TABLE TEST_T (COL VARCHAR2(4000 CHAR));

我需要在此表中插入多字节字符。字符为 3 字节字符。
我只能在表中插入 1333 个(最多 3999 个字节)字符。 我的期望是插入最多 1500 个多字节字符,但我得到 ORA - 01461
我不想将数据类型更改为 CLOB 或 LONG。 有没有办法使用 VARCHAR2(4000 CHAR) 来实现这一点。

下面是代码,

SET SERVEROUTPUT ON
DECLARE
  LV_VAR CHAR(1):='プ';     -- 3 byte character
  LV_STR VARCHAR2(32000) := '';
BEGIN
  FOR I IN 1..1500
  LOOP
    LV_STR := LV_STR||LV_VAR;
  END LOOP;
--
  INSERT INTO TEST_T VALUES (LV_STR);
END;
/



Error report -
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 11
01461. 00000 -  "can bind a LONG value only for insert into a LONG column"
*Cause:    
*Action:

【问题讨论】:

  • max_string_size 设置为什么?您能否将其设置为extended 而不是默认的standard?如果是这样,那将允许 varchar2 列 32k 长而不是 4000 字节。
  • @JustinCave 它仅设置为标准,但由于限制,我无法将其更改为扩展。

标签: oracle unicode oracle12c varchar2


【解决方案1】:

问题在于 4000 字节限制是硬限制,无论数据类型是定义为 VARCHAR2(4000 CHAR)VARCHAR2(4000 BYTE) 还是 NVARCHAR2(4000)。这意味着多字节字符总是有可能溢出最大大小的非 CLOB 文本列。

Oracle 的table of Datatype Limits 显示每个VARCHAR2 变体最多可容纳4000 个字节。而这正是你遇到的问题。

您可以选择将 Oracle 12c 数据库中 VARCHAR2 的最大大小增加到 32k。

操作方法如下:MAX_STRING_SIZE documentation

如果没有仔细考虑就不能这样做:一旦您将数据库更改为使用扩展的VARCHAR2 字符串,您将无法返回。 不过,如果您的数据库是您自己的,并且您喜欢拥有 32K 字符串的想法,那么此功能是专门为解决您的情况而创建的。

请仔细阅读可插拔数据库、容器数据库的详细信息,因为它们需要不同的升级技术。这是一个跨越整个数据库的更改,因此您希望正确处理。

【讨论】:

  • 感谢@Tad Harrison,我打算使用 CLOB 列进行实施
【解决方案2】:

VARCHAR2 的最大大小为 4000 字节 (VARCHAR2 max size),多字节字符不超过 4000+ 字节。您必须将类型更改为 CLOBNVARCHAR2

NVARCHAR2 的最大字节长度取决于配置的国家字符集 (NVARCHAR2)。

【讨论】:

    【解决方案3】:

    使用NVARCHAR2 代替 VARCHAR2

    NCHAR 和 NVARCHAR2 是存储 Unicode 字符数据的 Unicode 数据类型。 NCHAR 和 NVARCHAR2 数据类型的字符集只能是 AL16UTF16 或 UTF8,并在创建数据库时指定为国家字符集。 AL16UTF16 和 UTF8 都是 Unicode 编码。

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

    【讨论】:

      猜你喜欢
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2019-04-09
      • 2013-03-22
      • 2021-09-02
      • 2021-11-14
      相关资源
      最近更新 更多