Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle插入NVarchar2(4000)不允许4000个字符?_Sql_Sql Server_Oracle_Insert - Fatal编程技术网

Sql Oracle插入NVarchar2(4000)不允许4000个字符?

Sql Oracle插入NVarchar2(4000)不允许4000个字符?,sql,sql-server,oracle,insert,Sql,Sql Server,Oracle,Insert,我有一个字段数据类型为NVarchar2(4000)的表。我正在将数据从SQL Server移动到Oracle Server。SQL Server数据类型也是nvarchar(4000)。我在SQL Server端检查了此字段的最大大小,最大值为3996,比4000个字符的限制少了4个字符 当我尝试将此数据插入Oracle时,由于大小的原因,我得到一个错误“LONG” 这里发生了什么,Oracle NVarchar2(4000)是否不允许4000个字符?如果不是,限制是什么,或者我如何绕过这个限

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

当我尝试将此数据插入Oracle时,由于大小的原因,我得到一个错误“LONG”

这里发生了什么,Oracle NVarchar2(4000)是否不允许4000个字符?如果不是,限制是什么,或者我如何绕过这个限制?

尽管宽度指的是字符数,但仍有4000字节的限制:

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


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

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

从:

具有虚拟列的表将使用新数据类型更新 VARCHAR2(4000)的虚拟列的元数据,4000字节NVARCHAR2, 或原始(2000)类型

解决方案:-

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

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;

首先,正如其他人所指出的,除非您使用的是12.1,否则
varchar2
nvarchar2
数据类型在SQL中都限制在4000字节以内。在PL/SQL中,它们被限制为32767。在12.1中,可以使用将SQL限制增加到32767

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

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


如果您确实需要存储超过4000字节的数据,并且正在使用Oracle 11.2或更高版本,则必须使用
LOB
数据类型(
CLOB
NCLOB

我会实施这项计划,看看是否能解决这个问题。。谢谢你提供的信息。。原来是这样。。我看的是字符,而不是字节..谢谢,这就是我遇到的。。我将研究如何使用NCLOB场。。