他のDBMSからのテーブルをOracleに移行する場合、標準タスクの1つは、すべてのVARCHAR(n)
フィールドをVARCHAR2(n)
フィールドで置き換えることです(n <= 4000で提供)。
Oracle が他のDBMSのようにVARCHAR2
ではなく、このデータ型を呼び出すのはなぜVARCHAR
ですか?
他のDBMSからのテーブルをOracleに移行する場合、標準タスクの1つは、すべてのVARCHAR(n)
フィールドをVARCHAR2(n)
フィールドで置き換えることです(n <= 4000で提供)。
Oracle が他のDBMSのようにVARCHAR2
ではなく、このデータ型を呼び出すのはなぜVARCHAR
ですか?
回答:
Oracleには、VARCHAR2よりもVARCHARに異なる定義を与える計画があったように思われます。これはお客様にこれを伝えており、VARCHARの使用を推奨していません。11.2.0.2の時点で、それらの計画が何であれ、VARCHARはVARCHAR2と同一です。ここでは何であるSQL言語リファレンス11gリリース2は言います:
VARCHARデータ型を使用しないでください。代わりにVARCHAR2データ型を使用してください。VARCHARデータ型は現在VARCHAR2と同義ですが、VARCHARデータ型は、異なる比較セマンティクスと比較して、可変長文字列に使用される個別のデータ型として再定義される予定です。
PL / SQLユーザーズ・ガイドおよびリファレンス10gリリース2プットそれをこの方法:
現在、VARCHARはVARCHAR2と同義です。ただし、PL / SQLの将来のリリースでは、新しいSQL標準に対応するため、VARCHARは異なる比較セマンティクスを持つ個別のデータ型になる可能性があります。VARCHARではなくVARCHAR2を使用することをお勧めします。
データベースの概念10gリリース2文書が強いという点で同じことを言います:
VARCHARデータ型はVARCHAR2データ型と同義です。動作の変更を避けるため、常にVARCHAR2データ型を使用して可変長文字列を格納してください。
Oracle 9.2と8.1.7のドキュメントは本質的に同じことを言っているので、たとえOracleがVARCHARの使用を絶えず推奨していなくても、これまではVARCHAR2とのパリティを変更するために何もしていません。
varchar
以前はバージョン8 より前に長さの制限が異なっていたと思っていましたが、これをバックアップする信頼できるものを見つけることができず、今では単なる神話かどうか疑問に思います。
現在、この2つは同義語です。
VARCHARはANSI標準のデータ型ですが、OracleのVARCHARデータ型の実装は、空の文字列をNULLとみなすことでANSI標準に違反します(Oracleの実装はANSI標準よりも前です)。Leighが指摘しているように、Oracleは、空の文字列の処理方法に関して、VARCHARデータ型のセマンティクスが将来変更される可能性があると述べています。その場合、VARCHAR2データ型のセマンティクスは同じままです。VARCHAR2データ型を使用する方が安全です。これは、Oracleの将来のバージョンが、空の文字列がNULLと見なされなくなることによりコードが破損することを心配する必要がないためです。