[解決済み] Oracleのnullとemptyの文字列 [重複].
質問
重複の可能性があります。
Oracle 9i はなぜ空の文字列を NULL として扱うのですか?
Oracle 10gのテーブルで
TEMP_TABLE
という名前のテーブルがあり、2 つのカラムだけがあります。
id
と
description
の2つの形式がありますが、これはあくまでデモンストレーションのためです。
列は
id
はシーケンスで生成された主キーで、型は
NUMBER(35, 0) not null
で、カラム
DESCRIPTION
の型は
VARCHAR2(4000) not null
.
この場合の基本的なテーブル構造は、次のようになります。
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | NOT NULL | VARCHAR2(4000)|
+--------------+-----------+---------------+
このテーブルを作成した後、次のように挿入しようとしています。
INSERT
コマンドを交互に実行します。
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful
どちらも明らかなように失敗しています。
not null
の制約があるためです。
DESCRIPTION
カラムに適用されます。
どちらの場合も、Oracle は次のような文句を言います。
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
空文字列は
NULL
の値として扱われます。
もし私が
not null
の制約をなくすと
DESCRIPTION
カラムに制約をかけると、基本的なテーブル構造は次のようになります。
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
の両方と
INSERT
コマンドは成功します。これらは、2つの行を作成し、一方は
null
の値を持つ行と、空の文字列
''
の中に
DESCRIPTION
の列に
TEMP_TABLE
.
では、次のように発行すると
SELECT
コマンドを実行します。
SELECT * FROM temp_table WHERE description IS NULL;
を持つ行を両方取得します。
null
の値を持ち、もう一方が空の文字列
''
の中に
DESCRIPTION
の列に追加します。
次のような
SELECT
ステートメントから行を取得しません。
TEMP_TABLE
SELECT * FROM temp_table WHERE description='';
に空文字列がある行も取得しません。
DESCRIPTION
カラムに空文字列がある行も取得しません。
おそらく、Oracle は
null
値と空文字列
''
とは異なりますが、しかし、ここでは
INSERT
ステートメントでは
null
の値と空文字列
''
を持つカラムに挿入されるのを防ぐことができます。
not null
の制約があるカラムには挿入できません。なぜそうなるのでしょうか?
どのように解決するのか?
これは、Oracle が内部的に空の文字列を NULL 値に変更するためです。Oracleは単に空の文字列を挿入させないのです。
一方、SQL Serverでは、あなたが達成しようとしていることをさせることができます。
ここには2つの回避策があります。
- description' フィールドが有効であるかどうかを示す別のカラムを使用する。
- 空の文字列を格納したい場合は、'description' フィールドに何らかのダミー値を使用します。(例えば、実際のデータがそのような説明の値に遭遇することはないと仮定して、フィールドを 'stackoverflowrocks' に設定します)
もちろん、両方とも愚かな回避策です :)
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み] SQL Developerで変数の値を表示する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Oracle 9iはなぜ空の文字列をNULLとして扱うのですか?
-
[解決済み] Oracleで主キーカラムを取得する方法は?
-
[解決済み] SQL Developerで変数の値を表示する
-
[解決済み] 制約名でテーブル名を取得する [重複]。
-
[解決済み] DB内の全スキーマをリストアップするためのOracle SQLクエリ
-
[解決済み] Oracle Database 11gのHibernate方言?
-
[解決済み] oracleのDATEとTIMESTAMPの違いについて
-
[解決済み] Oracleストアドプロシージャにおける "AS "と "IS "の違いは何ですか?
-
[解決済み] Oracle SQL DeveloperのSQLワークシートウィンドウでテキストを印刷する
-
[解決済み] OracleでGUIDを生成するには?