7

皆さんは Oracle で空の文字列をどのように扱いますか?

ステートメント #1 : Oracle は、「varchar2」フィールドで空の文字列 ('' など) を NULL として扱います。
ステートメント #2 : 抽象的な「テーブル構造」を定義するモデルがあります。ここでは、NULL にすることはできませんが、 「空」にすることができるフィールドがあります。このモデルは、さまざまな DBMS で機能します。ほとんどどこでも、すべて問題ありませんが、Oracle ではそうではありません。「非ヌル」フィールドに空の文字列を挿入することはできません。
ステートメント #3 : このケースでは、空でないデフォルト値は許可されていません。

それで、誰かが私に教えてくれるのでしょうか - どうすれば解決できますか?

4

3 に答える 3

7

これが、オラクルがこれほどまでに人気がある理由を理解できなかった理由です。彼らは、何年も前に行ったばかげた決定に基づいて、実際には SQL 標準に従っていません。

Oracle 9i SQL リファレンスには次のように記載されています (これは、少なくとも 3 つのメジャー バージョンで存在します)。

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

しかし、彼らはあなたがをすべきかを言いません。この問題を回避するために私がこれまでに見つけた唯一の方法は、次のいずれかです。

  • NULL を表すために実際のデータでは発生できないセンチネル値を持っています (たとえば、姓フィールドの「デオキシリボ核酸」と、映画スターが子供たちに奇妙な名字だけでなく奇妙な姓を付け始めないことを願っています:-)。
  • 最初のフィールドが有効かどうかを示す別のフィールドがあります。これは、基本的に実際のデータベースが NULL に対して行うことです。
于 2009-03-28T04:41:20.970 に答える
3

「標準の SQL 動作をサポートするまで Oracle をサポートしない」と言うことが許されますか? 多くの点で、それは最も痛みの少ない方法のようです。

単一の空白、またはおそらく Unicode Zero Width Non-Break Space (U+FEFF) を強制 (使用) できない場合は、おそらく完全に独り占めして、32 個の Z などの信じがたいものを使用して、データは空白である必要がありますが、使用中の DBMS がひどいため、そうではありません。

于 2009-03-28T05:27:06.897 に答える
1

Empty string and NULL in Oracle are the same thing. You want to allow empty strings but disallow NULLs.

You have put a NOT NULL constraint on your table, which is the same as a not-an-empty-string constraint. If you remove that constraint, what are you losing?

于 2009-03-29T10:56:56.987 に答える