web-dev-qa-db-ja.com

Oracle Insert Into NVarchar2(4000)は4000文字を許可しませんか?

フィールドデータ型がNVarchar2(4000)のテーブルがあります。SQLServerからOracle Serverにデータを移動しています。 SQL Serverのデータ型もnvarchar(4000)です。 SQL Server側でこのフィールドの最大サイズを確認したところ、最大値は3996で、4000の制限を4文字下回っています。

このデータをOracleに挿入しようとすると、サイズが原因でエラー「LONG」が発生します。

ここで何が起こっていますか?Oracle NVarchar2(4000)は4000文字を許可しませんか?そうでない場合、制限は何ですか、またはどうすればこれを回避できますか?

11
Bruce Pullum

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;
11
Rahul Tripathi

まず、他の人が指摘したように、12.1を使用していない限り、varchar2nvarchar2の両方のデータ型が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)を使用する必要があります。

5
Justin Cave

ドキュメント のとおり、幅は文字数を指しますが、4,000バイトの制限があります。

文字データ型NVARCHAR2の幅の指定は、文字数を参照します。許可される最大列サイズは4000バイトです。

おそらく4つのマルチバイト文字があります。

0
Ben