Oracle 无法将数据插入 varchar2(4000 char) 列

hem*_*108 2 oracle unicode varchar2 oracle12c

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

\n\n
CREATE TABLE TEST_T (COL VARCHAR2(4000 CHAR));\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

下面是代码,

\n\n
SET SERVEROUTPUT ON\nDECLARE\n  LV_VAR CHAR(1):=\'\xe3\x83\x97\';     -- 3 byte character\n  LV_STR VARCHAR2(32000) := \'\';\nBEGIN\n  FOR I IN 1..1500\n  LOOP\n    LV_STR := LV_STR||LV_VAR;\n  END LOOP;\n--\n  INSERT INTO TEST_T VALUES (LV_STR);\nEND;\n/\n\n\n\nError report -\nORA-01461: can bind a LONG value only for insert into a LONG column\nORA-06512: at line 11\n01461. 00000 -  "can bind a LONG value only for insert into a LONG column"\n*Cause:    \n*Action:\n
Run Code Online (Sandbox Code Playgroud)\n

小智 6

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

Oracle 的数据类型限制表显示每个VARCHAR2变体最多可容纳 4000字节。而这正是您所遇到的问题。

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

操作方法如下:MAX_STRING_SIZE 文档

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

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