2009-03-28 29 views
7

空の文字列はどうやってOracleで扱いますか?Oracleの空の文字列

ステートメント#1:Oracleは、 "varchar2"フィールドで空の文字列(たとえば '')をNULLとして扱います。
声明#2:私たちは、がNULLではないことを、私たちはフィールドを持っているために抽象的な「テーブルの構造」を定義していますが、「空」することができモデルを持っています。このモデルはさまざまなDBMSで動作します。ほぼすべての場所で、すべて正常ですが、Oracleではうまくいきません。空でない文字列を "not null"フィールドに挿入することはできません。
ステートメント#3:この例では空のデフォルト値は使用できません。

だから、誰かが私に教えてくれてとても親切なのでしょうか?どうすれば解決できますか?

答えて

6

これは、私がオラクルがなぜ普及しているのかわからない理由です。彼らは何年も前に作ったばかげた決定に基づいて、実際にはSQL標準に従っていません。

のOracle 9iのSQLリファレンス状態(これは、少なくとも三つの主要なバージョンのがあった):

Oracleは現在、NULLとしてゼロの長さと文字値を扱います。ただし、これは将来のリリースでは引き続き真実ではない可能性があります。空の文字列をNULLと同じように扱わないことをお薦めします。

しかし、彼らはとは何かを言わないでください。あなたはすべきです。この問題を回避するために、私が今までに見つけた唯一の方法は、どちらかである:

  • はNULLを表現するために、あなたの実際のデータで発生することができませんセンチネル値を持っている(例えば、姓フィールドの「デオキシリボ」とはことを願っています映画スターは彼らの子供たちに奇妙な姓と奇妙な名前を与え始めません:-)。
  • には、最初のフィールドが有効かどうかを示すフィールドがあります。基本的に実際のデータベースはNULLを使用します。
+1

"これは何年も前に行った馬鹿げた決定に基づいています"そうです。後方互換性は決して問題ではないからです。 Oracleは、この動作に依存するコードのボート・ロードを中断することなく、空の文字列の動作を安全に変更できます.- – NullUserException

+0

@Null、互換性を損なうことなくこれを修正できる方法はいくつもあります。あなたのコメントを読んでから1秒以内に私の頭の中に飛び込んだ。「準拠」モードでそれを動かす特定のコードにフラグを設定できるようにした。そうすれば、すべてのコードに対して明示的にフラグを設定しなければ、完全な互換性が得られます。特定のコードでNULLを正しく扱うようにするには、そのフラグを設定します。もうゴミコードがないことを確信したら、フラグをグローバルに設定します。これらの "kludge"ビットは少なくともData Generalの時代からのものです:-) – paxdiablo

+0

これはSQL Serverの 'ANSI NULLS 'と似ていますが(例:' SET ANSI NULLS ON')、異なる環境で動作することができます大きな混乱の原因となる。 – NullUserException

2

"標準のSQL動作をサポートするまでOracleをサポートしないでください"と言うことができますか?それは多くの点で、最も苦痛に満ちた方法です。

1つの空白またはUnicodeのゼロ幅の非区切りスペース(U + FEFF)を強制的に(使用する)ことができない場合は、おそらく豚全体に行き、32 Zデータが空白であるべきであることを示すが、使用中のDBMSがOrribleであるためではない。

1

Oracleの空の文字列とNULLは同じものです。空の文字列を許可したいが、NULLは許可しない。

テーブルに空でない文字列制約と同じNOT NULL制約を設定しました。その制約を取り除くと、あなたは何を失っていますか?

+0

シャープなモデル定義です。 – Vugluskr

関連する問題