我有一个字段数据类型为NVarchar2(4000)的表我正在将数据从SQL Server移动到Oracle Server。 SQL Server数据类型也是nvarchar(4000)。我已检查SQL Server端此字段的MAX大小,MAX为3996,短于4000限制的4个字符。
当我尝试将此数据插入Oracle时,由于大小,我收到错误“LONG”。
这里发生了什么,Oracle NVarchar2(4000)不允许4000个字符?如果没有,限制是什么,或者我该如何解决这个问题?
答案 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,否则varchar2
和nvarchar2
数据类型在SQL中限制为4000字节。在PL / SQL中,它们仅限于32767.在12.1中,您可以使用MAX_STRING_SIZE
parameter将SQL限制增加到32767。
其次,除非您使用的是使用无法升级为使用Unicode字符集的非Unicode字符集的旧数据库,否则您需要避免使用nvarchar2
和nchar
数据类型在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)