Oracle Insert Into NVarchar2(4000)不允许4000个字符?

时间:2014-08-22 17:36:20

标签: sql sql-server oracle insert

我有一个字段数据类型为NVarchar2(4000)的表我正在将数据从SQL Server移动到Oracle Server。 SQL Server数据类型也是nvarchar(4000)。我已检查SQL Server端此字段的MAX大小,MAX为3996,短于4000限制的4个字符。

当我尝试将此数据插入Oracle时,由于大小,我收到错误“LONG”。

这里发生了什么,Oracle NVarchar2(4000)不允许4000个字符?如果没有,限制是什么,或者我该如何解决这个问题?

3 个答案:

答案 0 :(得分:11)

限制为4000字节而不是4000个字符。因此,具有AL16UTF16国家字符集的NVARCHAR2(4000)将占用最多4000个字节。

来自oracle docs of MAX_STRING SIZE

  

将使用新数据类型更新包含虚拟列的表   VARCHAR2(4000),4000字节NVARCHAR2的虚拟列的元数据,   或RAW(2000)类型。

<强>解决方案: -

此外,如果您想存储4000个字符,我建议您使用 CLOB

  

CLOB(字符大对象)是可以容纳的Oracle数据类型   最多4 GB的数据。 CLOB用于存储文本。

您可以尝试将列数据类型更改为CLOB:

ALTER TABLE table_name
 ADD (tmpcolumn  CLOB);

UPDATE table_name SET tmpcolumn =currentnvarcharcolumn;
COMMIT;

ALTER TABLE table_name DROP COLUMN currentnvarcharcolumn;

ALTER TABLE table_name
RENAME COLUMN tmpcolumn TO whatevernameyouwant;

答案 1 :(得分:5)

首先,正如其他人所指出的那样,除非您使用12.1,否则varchar2nvarchar2数据类型在SQL中限制为4000字节。在PL / SQL中,它们仅限于32767.在12.1中,您可以使用MAX_STRING_SIZE parameter将SQL限制增加到32767。

其次,除非您使用的是使用无法升级为使用Unicode字符集的非Unicode字符集的旧数据库,否则您需要避免使用nvarchar2nchar数据类型在Oracle中在SQL Server中,如果要存储Unicode数据,请使用nvarchar。在Oracle中,当您要存储Unicode数据时,首选的是在字符集支持Unicode(通常为varchar2)的数据库中使用AL32UTF8

如果将Unicode数据存储在Oracle NVARCHAR2列中,将使用国家字符集 - 这几乎肯定是AL16UTF16,这意味着每个字符至少需要2个字节的存储空间。因此,NVARCHAR2(4000)可能无法存储超过2000个字符。另一方面,如果使用VARCHAR2列,则可以使用可变宽度的Unicode字符集(AL32UTF8),在这种情况下,英文字符通常只需要1个字节,大多数欧洲字符需要2个字节,大多数亚洲字符需要3个字节(当然,这只是一个概括)。这通常会允许您在VARCHAR2列中存储更多数据。

如果您确实需要存储超过4000个字节的数据并且使用的是Oracle 11.2或更高版本,则必须使用LOB数据类型(CLOB或{{1} })。

答案 2 :(得分:0)

根据the documentation,尽管宽度指的是字符数仍有4,000字节的限制:

  

字符数据类型NVARCHAR2的宽度规格是指字符数。允许的最大列大小为4000字节。

您可能有4个多字节字符。