Oracle 无法将数据插入 varchar2(4000 char) 列
Oracle not able to insert data into varchar2(4000 char) column
我使用 Oracle 12c。我的数据库中有以下 table。
CREATE TABLE TEST_T (COL VARCHAR2(4000 CHAR));
我需要在此 table 中插入多字节字符。该字符为3字节字符。
我只能在 table 中插入 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:
使用 NVARCHAR2 而不是 VARCHAR2
NCHAR and NVARCHAR2 are Unicode datatypes that store Unicode character data. The character set of NCHAR and NVARCHAR2 datatypes can only be either AL16UTF16 or UTF8 and is specified at database creation time as the national character set. AL16UTF16 and UTF8 are both Unicode encoding.
The maximum length of an NVARCHAR2 column is 4000 bytes. It can hold up to 4000 characters. The actual data is subject to the maximum byte limit of 4000. The two size constraints must be satisfied simultaneously at run time.
VARCHAR2 的最大大小为 4000 字节 (VARCHAR2 max size),多字节字符不能超过 4000 字节。您必须将类型更改为 CLOB 或 NVARCHAR2.
NVARCHAR2 的最大字节长度取决于配置的国家字符集 (NVARCHAR2)。
问题是 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 字符串的想法,那么这个功能就是专门为解决您的情况而创建的。
请仔细阅读可插拔数据库、容器数据库的详细信息,因为它们需要不同的升级技术。这是一项跨越整个数据库的更改,因此您希望正确处理。
我使用 Oracle 12c。我的数据库中有以下 table。
CREATE TABLE TEST_T (COL VARCHAR2(4000 CHAR));
我需要在此 table 中插入多字节字符。该字符为3字节字符。
我只能在 table 中插入 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:
使用 NVARCHAR2 而不是 VARCHAR2
NCHAR and NVARCHAR2 are Unicode datatypes that store Unicode character data. The character set of NCHAR and NVARCHAR2 datatypes can only be either AL16UTF16 or UTF8 and is specified at database creation time as the national character set. AL16UTF16 and UTF8 are both Unicode encoding.
The maximum length of an NVARCHAR2 column is 4000 bytes. It can hold up to 4000 characters. The actual data is subject to the maximum byte limit of 4000. The two size constraints must be satisfied simultaneously at run time.
VARCHAR2 的最大大小为 4000 字节 (VARCHAR2 max size),多字节字符不能超过 4000 字节。您必须将类型更改为 CLOB 或 NVARCHAR2.
NVARCHAR2 的最大字节长度取决于配置的国家字符集 (NVARCHAR2)。
问题是 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 字符串的想法,那么这个功能就是专门为解决您的情况而创建的。
请仔细阅读可插拔数据库、容器数据库的详细信息,因为它们需要不同的升级技术。这是一项跨越整个数据库的更改,因此您希望正确处理。