フィールドデータ型がNVarchar2(4000)のテーブルがあります。SQLServerからOracle Serverにデータを移動しています。 SQL Serverのデータ型もnvarchar(4000)です。 SQL Server側でこのフィールドの最大サイズを確認したところ、最大値は3996で、4000の制限を4文字下回っています。
このデータをOracleに挿入しようとすると、サイズが原因でエラー「LONG」が発生します。
ここで何が起こっていますか?Oracle NVarchar2(4000)は4000文字を許可しませんか?そうでない場合、制限は何ですか、またはどうすればこれを回避できますか?
4000文字ではなく4000バイトの制限があります。したがって、AL16UTF16国別文字セットを使用するNVARCHAR2(4000)は、最大4000バイトを占有します。
MAX_STRING SIZEのOracleドキュメント から:
仮想列を持つテーブルは、VARCHAR2(4000)、4000バイトNVARCHAR2、またはRAW(2000)タイプの仮想列の新しいデータ型メタデータで更新されます。
ソリューション:-
また、4000文字を保存する場合は、[〜#〜] clob [〜#〜]を使用することをお勧めします
CLOB(Character Large Object)は、最大4 GBのデータを保持できるOracleデータ型です。 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では、 MAX_STRING_SIZE
パラメーター を使用してSQL制限を32767に増やすことができます。
第2に、Unicode文字セットを使用するようにアップグレードできない非Unicode文字セットを使用するレガシーデータベースで作業しているのでない限り、Oracleでnvarchar2
およびnchar
データ型を回避する必要があります。 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
またはNCLOB
)を使用する必要があります。
ドキュメント のとおり、幅は文字数を指しますが、4,000バイトの制限があります。
文字データ型NVARCHAR2の幅の指定は、文字数を参照します。許可される最大列サイズは4000バイトです。
おそらく4つのマルチバイト文字があります。