hem*_*108 2 oracle unicode varchar2 oracle12c
我使用 Oracle 12c。我的数据库中有下表。
\n\nCREATE 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\nSET 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字节。而这正是您所遇到的问题。
您可以选择将VARCHAR2
Oracle 12c 数据库的最大大小增加到 32k。
操作方法如下:MAX_STRING_SIZE 文档
如果没有仔细考虑,就不能这样做:一旦将数据库更改为使用扩展VARCHAR2
字符串,您就无法返回。然而,如果您的数据库完全是您自己的,并且您喜欢拥有 32K 字符串的想法,那么这个功能就是专门为了解决您的情况而创建的。
请仔细阅读可插拔数据库、容器数据库的详细信息,因为它们需要不同的升级技术。这是一个涉及整个数据库的更改,因此您希望正确执行。