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

Bru*_*lum 11 sql sql-server oracle insert

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

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

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

Rah*_*thi 11

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

来自MAX_STRING SIZEoracle文档:

具有虚拟列的表将使用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;
Run Code Online (Sandbox Code Playgroud)


Jus*_*ave 5

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

其次,除非你与使用非Unicode字符集不能升级使用Unicode字符集的遗留数据库的工作,你会希望避免nvarchar2nchar数据类型在Oracle中.在SQL Server中,您可以nvarchar在要存储Unicode数据时使用.在Oracle中,首选是varchar2在数据库中使用,AL32UTF8当您要存储Unicode数据时,该数据库的字符集支持Unicode(通常).

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

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