テーブル列にデータがないことを表すには、NULL または空の文字列を使用する必要がありますか?

StackOverflow https://stackoverflow.com/questions/167952

  •  03-07-2019
  •  | 
  •  

質問

Null または空の文字列 -- テーブルの列にデータがないことを表すには、どちらの方が優れていますか?(私は特に MySQL を使用していますが、これはシステムに依存しないと考えています。)一方を使用することと他方を使用することに大きな利点/欠点はありますか、それとも単にプログラマーの好みでしょうか?

役に立ちましたか?

解決

NULLを無条件で使用すると言うすべての人に強く反対します。列をNULLにできるようにすると、列をNOT NULLとして設定した場合にはない追加の状態が導入されます。追加の状態が必要ない場合は、これを行わないでください。つまり、空の文字列の意味とnullの意味の違いがわからない場合は、列をNOT NULLとして設定し、空の文字列を使用して空を表します。同じことを2つの異なる方法で表すのは悪い考えです。

NULLを使用するように言ったほとんどの人は、NULLが空の文字列とは異なることを意味する例を示しました。そして、それらの例では、それらは正しいです。

ただし、ほとんどの場合、NULLは不必要な余分な状態であり、プログラマがより多くのケースを処理する必要があります。他の人が述べたように、OracleはNULLと空の文字列を同じものとして扱うため、この余分な状態の存在を許可しません(Oracleでnullを許可しない列に空の文字列を格納することは不可能です)。

他のヒント

ヌル。空の文字列は「データなし」ではなく、空のデータです。

ヌルの方が良い""実際にデータを表し、コードに同じものを登録しません

リレーショナル データベース モデルのコンテキストでは、null は「値なし」または「不明な値」を示します。それはまさにあなたが説明した目的のために存在します。

アップデート:申し訳ありませんが、ほとんど (すべて?) RDMBS は null に対してこれと同じ定義を使用しますが、null の処理方法には微妙な違いがあることを付け加えるのを忘れていました。たとえば、MySQL と Oracle では、UNIQUE カラム (またはカラムのセット) に複数の null を許可します。これは、null は値ではなく、一意であると見なすことができないためです (null != null)。しかし、最後に MS SQL Server を使用したときは、null を 1 つだけ許可していました。したがって、RDBMS の動作と、問題の列が制約されるかインデックスが作成されるかを考慮する必要がある場合があります。

どちらでもない。データの不在をリレーションのタプルの不在として表します。

パフォーマンス上の理由から、一部のRDBMSでの結合を避けたい場合もありますが、欠落している可能性のある情報が別の関係になるようにモデルを設計してみてください。

MySQLサイトからのリンクがいくつかあります:

http://dev.mysql.com /doc/refman/5.0/en/problems-with-null.html

http://dev.mysql.com /doc/refman/5.0/en/working-with-null.html

一度読みましたが、 NULL の値は2ビットですが、空の文字列は1ビットだけです。 99%の時間でこれは何の違いもありませんが、 NULL '' かどうかは問題ではない非常に大きなテーブルでは、これがtrueの場合、 '' を使用します。

常にNULLを使用します。 「この人の電話番号がわからない」の違いを考えてください。 (NULL)および「この人は空白のままにしました」 (空白)。

ジョブに適切なツールを使用します。 NULLは、(まだ)値が提供されなかったことを意味するか、値が適用されないことを意味します。

ただし、空の文字列も情報です。値が適用可能であり、与えられたことを示すことができますが、たまたま空の文字列です。

列にNULLと ''の両方を含めることを許可すると、これらのケースを区別できます。いずれにせよ、一方を使用して他方を示すのは良くありません。

文字列の連結では、NULLと組み合わせるとNULLが生成されることに注意してください。たとえば、CONCAT(NULL、 'foo')はNULLを生成します。 NULLをSQL式のデフォルト値に変換する場合は、COALESCE()関数の使用方法を学習します。

ほとんどの場合、nullの方が優れています。おそらくほとんど違いがない状況もありますが、ほとんどありません。 field = '' field is null と同じではない(少なくともMySQLでは)ことをクエリするときに覚えておいてください。

私が知る限り、Oracleは違いを区別しません。

select 1 from (select '' as col  from dual) where col is null;

列にデータがない理由を検討してください。テーブルのデザインがだらしないということですか? nullは好きではありませんが、nullが適切である(または適切である)場合があり、システムは通常死ぬことはありません。候補キー(主キーまたは代替キー)にNULLを許可しないでください。

null許容列とメインテーブルへの外部キーだけに個別のテーブルを作成します。レコードにその列のデータがない場合、2番目のテーブルにはレコードがありません。これは最もクリーンなソリューションであり、nullの処理や空の文字列に特別な意味を与えることを心配する必要はありません。

NULLは、値が生成されない暗黒時代に追いやられるべき値ではありません。デフォルト値で簡単に処理できる特別なNULLケースを処理するために、必要な量のプログラミングが必要なことがわかりました。

列のデフォルトを空の文字列に設定します。 nullを許可しないように列を強制します。これは、デフォルト値を割り当てた後はほとんど発生しません。 列の値がnullの場合を無視して、コードを素直に記述します。

NULLで常に抱えていた大きな問題の1つは、「SELECT * from tbl WHERE column = NULL」ということです。常に空の結果セットを返します。 NULLは、NULLを含め、いかなるものにも等しくなることはありません。特殊なキーワード" column is null" nullかどうかを確認する唯一の方法です。 nullから離れると、比較は成功します。" column = ''" 7行が返されました。

最後にNULLを使用して後悔した2つの主要なDB実装をゼロから実行しました。次回は、私にとってNULLはありません!

重要な例外が1つあります。ビル・カーウィンは、「CONCAT(NULL、 'foo')はNULLを生成する」と述べました。これはほとんどのRDBMSに当てはまりますが、Oracleには当てはまりません。

上記のJames Curranが示唆したように、OracleはNULLと空の文字列をまったく同じように処理することで、このかなり重要な分岐点を選択して標準SQLから逸脱しました。ただし、それらを同じように扱うよりも悪いことに、連結時にNULL以外のものを返すことにより、実際にはNULL値の意味を損なう可能性があります。

具体的には、oracle CONCAT(NULL、 'foo')では 'foo'が生成されます。オラクルのおかげで、私はあなたにとって重要ではないかもしれないnullを失いましたが、データがさらに処理するために他のRDBMSに渡されるときに間違いなく違いをもたらします。

「データなし」列の値はデフォルト値で表される必要があります。 NULLは不明な値を意味することに注意してください。つまり、列に値が含まれているかどうかはわかりませんが、現時点ではわかりません。

たとえば、融資申請システムでは、運転免許証番号フィールドのNULL値は、申請者または融資処理者が運転免許証番号を入力しなかったことを意味します。 NULL値は、申請者にライセンスがないことを自動的には意味しません。彼はライセンスを持っているかもしれないし、持っていないかもしれません。あなたはそれを知らないだけです。

文字列列にはあいまいさがあります。値がない場合、数値列には明らかにゼロが含まれます。値なしの文字列をどのように表現できますか?上記の例では、運転免許証のない申請者に対して、「none」などの任意のデフォルト値を割り当てることができます。またはさらに良いのは空の文字列です。一貫性を保つために、他のテーブルでデフォルトの空の値を使用するようにしてください。

原則としてNULLを使用しないという問題については、NULLが実際に不可欠な場合があります。統計を広範囲に使用する人として、データプロバイダーは不完全なデータを含むデータセットを提供することが一般的です。たとえば、国ごとのGDPのデータセットでは、不足しているGDPの数を前年度と後年度に見つけることができます。理由の1つは、その年の政府の公式データがないことです。 GDPがゼロ(DUH!)であると結論づけ、抽出されたデータまたはグラフにゼロ値を表示するのは正しくありません。正しい値はNULLです。つまり、データはまだありません。エンドユーザーは、抽出されたデータとグラフの欠落データポイントをゼロではないものとして正しく解釈します。さらに、特に平均を行う場合は、計算でエラーが発生することはありません。

一部の「ルール」理論的に理にかなっていることは、実際にはあなたの場合の貧弱なまたは間違った解決策です。

NULL値は参照整合性に役立つことがわかりました。 MySQLの場合、フィールドがNOT NULLに設定されている場合、挿入にはデータの設定が必要です。それ以外の場合、NULLは可能な値であり、外部キー制約は強制されません。

  1. id:主キー
  2. product_id:NULL以外の外部キー
  3. ref_id:(NULLABLE)

idおよびproduct_idエリアは常に必要です。 ref_idはNULLに設定できます。ただし、他の値を使用する場合は、外部キー制約を満たす必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top