9

11gの公式ドキュメントによると

Oracle Databaseは現在、長さがゼロの文字値をNULLとして扱います。ただし、これは今後のリリースでは当てはまらない可能性があるため、空の文字列を null と同じように扱わないことをお勧めします。

getVersion次の可能性がある varchar2 を返す関数を考えてみましょう''

l_version := x.getVersion;
if l_version is null then
  return 'V.1.0';
end if;

これは現在の Oracle 11g では正しく動作しますが、将来の Oracle バージョン''null.

上記の将来の証明を行う唯一の方法は次のとおりです。

if l_version is null or l_version = '' then

面倒ではない方法はありますか?

4

3 に答える 3

10

varchar2コード全体で使用していると仮定すると、l_version is null将来の証明になります。

Oracle はvarchar2、ANSI 標準がvarcharNULL と空の文字列を別々のエンティティとして扱う必要があると宣言したときに、データ型を作成しました。その意図は、varchar2データ型の動作が今後も一貫したままvarcharであり、将来的には新しい標準の NULL 比較セマンティクスを使用できるようにすることでした。もちろん、今日varcharvarchar2はお互いの同義語であり、少なくとも数十年前から存在しているためvarchar、将来 Oracle が実際にデータ型の動作を変更する可能性はかなり低いです。

およびデータ型のドキュメントVARCHAR2VARCHARを見るとVARCHAR、将来変更される可能性のある比較セマンティクスについて説明されています。残念ながら、彼らが話している比較セマンティクスが NULL と空の文字列の間の同等性 (またはその欠如) であることは明確ではありません。しかし、VARCHARは ANSI 標準のデータ型であり、VARCHAROracle と ANSI 標準の間の比較セマンティクスの唯一の違いは、空の文字列が NULL であるかどうかであり、それが一般的に受け入れられている解釈です。

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

于 2015-05-27T18:13:25.867 に答える
6

動作が変更された場合、空の文字列と null を区別できるようにしたくないでしょうか? 言い換えれば、空の文字列と null を同じものとして扱う将来の保証コードは、いずれにせよ将来再検討する必要があるでしょう。

また、現在、世界中の Oracle データベースに格納されている 1,000 億兆個の null 文字列が、今後も null のままです。

したがって、私のアドバイスは、それを忘れて、IS NULL を使用することです。

于 2015-05-27T18:11:12.297 に答える
0

弁護士が Oracle のドキュメントに侵入したようです。Oracle が varchar2 を使用して空の文字列を処理する方法を突然変更すると、100 万年後には想像もできません。ドキュメントのこのステートメントは、念のため「あなたのa$$をカバーする」ようです。したがって、心配する必要はありません。どちらかといえば、varchar2 ではなく、varchar の動作を変更します。

とにかく私の2セント。

于 2015-05-27T20:27:42.343 に答える