web-dev-qa-db-ja.com

Oracle VARCHARとVARCHAR2データ型の違いは何ですか?

他のDBMSからOracleに移行するテーブルを移行する場合、標準的なタスクの1つは すべてのVARCHAR(n)フィールドをVARCHAR2(n)フィールドで置き換える (n <= 4000の場合) 。

Oracleが他のDBMSのようにVARCHARだけでなく、このデータ型をVARCHAR2と呼ぶのはなぜですか?

19
bernd_k

[〜#〜] varchar [〜#〜]VARCHAR2。これは顧客にこれを伝えており、[〜#〜] varchar [〜#〜]を使用しないことを推奨しています。彼らの計画が何であれ、11.2.0.2[〜#〜] varchar [〜#〜]VARCHAR2SQL言語リファレンス11gリリース2 の内容は次のとおりです。

VARCHARデータ型は使用しないでください。代わりにVARCHAR2データ型を使用してください。 VARCHARデータ型は現在VARCHAR2と同義ですが、VARCHARデータ型は、さまざまな比較セマンティクスと比較して、可変長文字列に使用される個別のデータ型として再定義される予定です。

PL/SQLユーザーガイドおよびリファレンス10gリリース2 は次のように記述します。

現在、VARCHARはVARCHAR2と同義です。ただし、PL/SQLの将来のリリースでは、新しいSQL標準に対応するために、VARCHARは異なる比較セマンティクスを持つ別個のデータ型になる可能性があります。 VARCHARではなくVARCHAR2を使用することをお勧めします。

Database Concepts 10g Release 2 ドキュメントは、同じことをより強力に述べています。

VARCHARデータ型は、VARCHAR2データ型と同義です。考えられる動作の変化を回避するには、常にVARCHAR2データ型を使用して可変長文字列を格納します。

Oracle 9.2と8.1.7のドキュメントは本質的に同じことを言っているので、Oracleは[〜#〜] varchar [〜#〜]、これまでのところ、VARCHAR2とのパリティを変更するために何もしていません。

26
Leigh Riffel

現在、この2つは同義です。

VARCHARはANSI標準のデータ型ですが、VARCHARデータ型のOracleの実装は、空の文字列をNULLと見なすことによりANSI標準に違反しています(Oracleの実装はANSI標準に先行しています)。リーが指摘するように、Oracleは、VARCHARデータ型のセマンティクスが空の文字列の処理方法に関して将来変更される可能性があると述べています。その場合、VARCHAR2データ型のセマンティクスは同じままです。 VARCHAR2データ型を使用すると、空の文字列がNULLと見なされなくなり、Oracleの将来のバージョンでコードが破損することを心配する必要がないため、より安全です。

25
Justin Cave

元のSQL標準ではVARCHARは255文字でしたが、当時Oracleは少なくとも標準への準拠を試みていました。

3
Gaius